web-dev-qa-db-ja.com

64ビットAndroid-Lプラットフォームで32ビットネイティブライブラリを使用する方法

Android AOSP(KitKat)でコンパイルしたアプリケーションをAndroidシステムアプリケーションとして使用していて、正常に実行されていました。私のアプリケーションは、でコンパイルされたネイティブコードに依存しています。 32ビットライブラリとしてのAndroid-NDK。Androidアプリケーションlibs/armeabiフォルダ内のネイティブライブラリをコピーしてから、Android = AOSPのアプリケーション(device.mkを変更して/ system/libフォルダーにライブラリをコピーしました)Android KitKat。

アプリケーションをAndroid-L(64ビットプラットフォーム)に移植すると、Androidアプリケーションからネイティブライブラリをロードできず、エラーは-

Java.lang.UnsatisfiedLinkError: dlopen failed: "libfoobar.so" is 32-bit instead of 64-bit

私は次のJavaコードを使用してネイティブライブラリをロードしています-

        if ( ENABLE_Android_INTEGRATION )
        {
            System.load("/system/lib/libfoobar.so");
        }
        else
        {
            System.loadLibrary("foobar");
        }

AOSPを使用してコードをビルドしている場合、ENABLE_Android_INTEGRATIONtrue

さらに興味深いことに、ENABLE_Android_INTEGRATIONをオフにして、アプリケーションをEclipseでビルドし、AOSPの外部で通常の「ダウンロード可能な」アプリケーションとしてビルドすると、アプリケーションは64ビットAndroidプラットフォームで正常に実行されます。

知りたいこと-アプリケーションをネイティブとしてビルドするにはどうすればよいですかAndroid 64ビット用の32ビットライブラリ(つまりAOSPビルド)を備えたシステムアプリケーションAndroidプラットホーム?

私が試したこと-使用しましたLOCAL_32_BIT_ONLY = trueフラグをAndroidアプリケーションのAndroid.mkファイルに入れましたが、役に立たなかったと思われます。このフラグの使用に注意してください。

時間がなくなったので、この質問をRnDではなくグループで投稿することを好みました。誰かがこの問題に直面した場合は、ガイドしてください。

よろしく、メラジ

9
Meraj Ahmad

サードパーティのアプリケーションとしてインストールしたときに機能する理由は、インストール時にパッケージマネージャーがAPKをスキャンし、ネイティブライブラリを使用しているかどうかを確認し、ネイティブライブラリが見つかった場合は、使用したABIを保存するためです(ライブラリのみをインストールするため) 1つのABIの場合、どの選択が行われたかに関する情報をどこかに保存する必要があります)。

/ system/libのライブラリを使用してシステム全体にインストールされるアプリケーションの場合、この特定のアプリケーションが/ system/libの一部のアプリ固有のライブラリ(/ system /の64ビットバージョンでは使用できない)に依存していることは明らかではありません。 lib64)であるため、パッケージ/アプリケーションマネージャーは、この特定のアプリが特定のABIを必要としていることを認識できないため、64ビットモードで実行します。

LOCAL_32_BIT_ONLYの設定は、おそらく32ビットモードでコンパイルする必要があるかどうかにのみ影響し、実行する方法には影響しません。

http://www.slideshare.net/hidenorly/investigation-result-on-64-bit-support-in-aosp の古い(そしておそらく時代遅れの)レポートは、ネイティブライブラリが示唆しているようですアプリの場合は/ system/lib /apknameに移動する必要がありますが、これは実際のAndroid5.0システムでは当てはまらないようです。代わりに、ライブラリは/ system/app /appname/ lib /abinameにあるようです。一部のアプリには複数のアーキテクチャ用のネイティブライブラリがあるようです(たとえば、「arm」と「arm64」の両方をabinameとして)、他のアプリには単一のアーキテクチャしかない(プロセスを強制する)そのABIモードで開始されます)。

したがって、ネイティブライブラリのインストール方法のメカニズムを変更する必要があると思います(device.mkを手動で変更したとおっしゃいました)-AOSPビルドの一部として独自のアプリをビルドする方法に慣れていませんが、お勧めします既存のバンドルされたアプリをどのように実行するかを調べようとすると、このコミットは関連している可能性があります: https://Android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/

9
mstorsjo

私は同じ問題を抱えており、答えを見つけました ここ および ここ すべての64ビットライブラリを削除し、32ビットライブラリのみを残しました:Android.mkの場合:

APP_API := armeabi armeabi-v7a x86 mips

Build.gradle(Module:app)の場合:

ndk {
    moduleName "<module_name>"
    abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
5
Dmitry Velychko

https://source.Android.com/source/64-bit-builds.html

Android.mkでこれを試してくださいLOCAL_MULTILIB:= 32

0
AudiO