web-dev-qa-db-ja.com

64ビットで32ビットjniライブラリを使用するandroid

Nexus 9でネイティブライブラリを使用してアプリケーションを実行しようとしました。

アプリケーションはエラーメッセージで終了します。

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

この問題の既知の回避策はありますか(もちろん、ライブラリを再コンパイルしてapkを大きくすることを除く)。

27
G B

説明を見つけました:64ビットAndroidは、System.loadlLibrary()がデフォルトの検索パスでより良いものを見つけられない場合にのみ、32ビットネイティブライブラリをフォールバックとして使用できます。 UnsatisfiedLinkError System.load()を使用して完全なライブラリパスを使用してシステムに32ビットライブラリをロードさせる場合、最初の回避策はSystem.load()の代わりにSystem.loadLibrary()を使用することです。

追加の考慮事項として、ライブラリを混在させることはできません。フォールバック動作は、アプリケーションがロードする最初のライブラリにのみ適用されます。最初のライブラリが64ビットの場合、同じアプリケーションで32ビットライブラリを読み込むことはできません。逆の場合も同様です。

30
G B

ポイントは、実行環境を32ビットに変換することです

  1. build.gradleに以下のコンテンツを追加します

    defaultConfig:{... ndk {abiFilters "armeabi"、 "armeabi-v7a"、 "x86"、 "mips"}}

  2. Android.useDeprecatedNdk=truegradle.propertiesに追加します

  3. ライブラリの下にarmeabiという名前の新しいフォルダーを追加し、32ビット.soファイルを新しいフォルダーにコピーします
13
vincent.song

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

あなたのAndroid.mkでこれを試してください

LOCAL_MULTILIB := 32
1
AudiO

いいえ、ネイティブライブラリが動作するには64ビットと互換性がある必要があります。

公式ドキュメントを参照してください: JNIヒント:64ビットの考慮事項

0
shkschneider

私にとって問題は、アプリのビルド設定で高度なプロファイリング機能を有効にしたことでした

0
Giacomo Locci

私のためのこの仕事:

 ndk {
        abiFilters 'armeabi-v7a', 'x86'
    }
0
Hassan

同じ問題が発生しました。Android Studio 2.1から2.2.3(ndk v.13.1を使用))への更新を行いましたが、Googleで見つけたヒントはまったく役に立ちませんでした(abiFiltersの使用、 「lib/x86_64/lib….so」、LOCAL_MULTILIB:= 32、またはTARGET_PREFER_32_BIT:= true、…)を除外します。

最後に、以前のndkコンパイラー、つまりAndroid-ndk-r10eを使用するだけで、最新のAS v2.2.3(Android.mkまたはbuild.gradleで何も変更せずに)で再び動作するようになりました

「armeabi-v7a」および「x86」専用のndk-buildを使用してライブラリを手動でビルドしましたが、arm64ではAndroidでチャームのように機能しました。

0
fjnet