Nexus 9でネイティブライブラリを使用してアプリケーションを実行しようとしました。
アプリケーションはエラーメッセージで終了します。
Java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
この問題の既知の回避策はありますか(もちろん、ライブラリを再コンパイルしてapkを大きくすることを除く)。
説明を見つけました:64ビットAndroidは、System.loadlLibrary()がデフォルトの検索パスでより良いものを見つけられない場合にのみ、32ビットネイティブライブラリをフォールバックとして使用できます。 UnsatisfiedLinkError System.load()を使用して完全なライブラリパスを使用してシステムに32ビットライブラリをロードさせる場合、最初の回避策はSystem.load()の代わりにSystem.loadLibrary()を使用することです。
追加の考慮事項として、ライブラリを混在させることはできません。フォールバック動作は、アプリケーションがロードする最初のライブラリにのみ適用されます。最初のライブラリが64ビットの場合、同じアプリケーションで32ビットライブラリを読み込むことはできません。逆の場合も同様です。
ポイントは、実行環境を32ビットに変換することです
build.gradleに以下のコンテンツを追加します
defaultConfig:{... ndk {abiFilters "armeabi"、 "armeabi-v7a"、 "x86"、 "mips"}}
Android.useDeprecatedNdk=true
をgradle.propertiesに追加します
.so
ファイルを新しいフォルダーにコピーしますいいえ、ネイティブライブラリが動作するには64ビットと互換性がある必要があります。
公式ドキュメントを参照してください: JNIヒント:64ビットの考慮事項
私にとって問題は、アプリのビルド設定で高度なプロファイリング機能を有効にしたことでした
私のためのこの仕事:
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
同じ問題が発生しました。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でチャームのように機能しました。