AndroidはLinuxベースのOSであるため、Raspberry PiなどのARM Linuxで実行したい場合があります。しかし実際には、主にAndroidのsoライブラリがBionic libcを介して標準ライブラリとしてのglibcを置き換えるため、依然として問題があります。この2つには多くの違いがあり、直接使用することはできません。
この問題を解決するために、libhybrisライブラリが登場しました。その主な機能は、AndroidライブラリをBionic libcのメソッドであるLink to glibcに参照して、ARM LinuxでのAndroidライブラリのサポートを実現することです。libhybrisは当初、すべてのLinuxディストリビューションでAndroidドライバーをサポートするために使用されていました。たとえば、Ubuntu TouchとSailfish OSはどちらもこのライブラリを使用して、Androidデバイスと互換性があります。概略図は次のとおりです。
libhybrisの主な役割は、libcライブラリの互換性の問題を解決することです。目的は、bionic(主にAndroidのクローズドソースHALライブラリ)でコンパイルされたライブラリをGNU Cライブラリベースのシステムで実行することです。Ubuntu touch、WebOS、Jolla Sailfish OS、その他のシステムで使用されています。ただし、これらのシステムはglibcエコロジーに基づいているため、既存のハードウェアメーカーが提供するドライバーのほとんどはAndroid用に作成されており、自然にバイオニックでコンパイルされています。それから、別のドライバーを書くようにメーカーを説得するのは簡単ではありません。たとえそれが書かれたとしても、成熟するまでにはしばらく時間がかかります。では、glibcベースのシステムに既存のAndroidドライバーを再利用させるにはどうすればよいでしょうか。これにはlibhybrisのような互換性レイヤーが必要です。
1.ライブラリのコンパイル
まず、Linuxシステムを実行するArmアーキテクチャマシンを準備する必要があります。最新のdebianまたはubuntuシステムをインストールするのが最適です。これはいくつかの奇妙なエラーをコンパイルしません
下载libhybris源码
# git clone https://github.com/libhybris/libhybris.git
# ./autogen.sh
android-headersを確認する場合...は表示されません。停止し、Makefileは生成されませんでした。以下はあなたが解決するためのものです、それが他のエラーである場合は、自分でBaiduを実行してください(一般的に環境は良くありません)
このandroid-headersとは何ですか?私も長い間従事してきましたが、ソースコードutils / extract-headers.shにandroid-headersという単語が見つかりました
ANDROID_ROOTはもちろんAndroidのソースコードです。android-headersはubuntuシステムの公式ウェブサイトからダウンロードできます。
ダウンロード後にスクリプトを実行する
提取android头文件
# ./extract-headers.sh android-aosp/ /tmp/android-headers/ 4 2 2
这里4 2 2编译不过,就去掉了4 2 2 ,
然后在android-headers目录
# make install。
次にlibhybrisに戻り、エラーなしで./autogen.shを実行します。makeがコンパイルされると、libandroid-properties.soとlibhybris-common.soがあります。それを/ usr / libファイルディレクトリにコピーし、インクルードファイルを/ usr / includeディレクトリにコピーします。もちろん、make installを使用できますが、他のライブラリの使用方法がわからないので、コピーはありません。
次に、ルートディレクトリに新しい/ system / lib64ディレクトリを作成します(私のシステムは64ビットです)このディレクトリには、androidライブラリとその依存ライブラリが格納されています。android build.propをシステムディレクトリにコピーします。
2.ライブラリ
Android.mk の使用:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libfoo
LOCAL_SRC_FILES:= foo.cpp
include $(BUILD_SHARED_LIBRARY)
foo.cpp:
#include <stdio.h>
#include <stdlib.h>
void foo(void)
{
printf("foo\n");
printf("%s\n", getenv("PATH"));
}
void bar(void)
{
foo();
printf("bar\n");
}
android库拷贝至linux系统的/system/lib64目录下
通过libhybris,调用bar函数:
#include <stdio.h>
#include <hybris/common/dlfcn.h>
#include <string.h>
#include <errno.h>
int main(void)
{
void *handle;
void (*bar)(void);
handle = hybris_dlopen("libfoo.so", RTLD_NOW);
if (NULL == handle)
{
fprintf(stderr, "android_dlopen failed: %s\n", strerror(errno));
return -1;
}
bar = (void (*)(void))hybris_dlsym(handle, "_Z3barv");
if (NULL == bar)
{
fprintf(stderr, "fail to dlsym: %s\n", strerror(errno));
return -1;
}
bar();
return 0;
}