libhybrisライブラリを使用してLinuxがAndroidライブラリを呼び出すようにする

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回路図

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;

}

 

元の記事766件を公開 賞賛された474件 254万回の閲覧

おすすめ

転載: blog.csdn.net/u010164190/article/details/105533354