私のアプリケーションでは、armeabi、armeabi-v7a、およびx86専用にコンパイルされたネイティブライブラリを使用しています。
このライブラリがSamsung S6などの64ビットデバイスにロードされると、アプリケーションはUnsatisfiedLinkErrorでクラッシュします
Java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[Zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
at Java.lang.Runtime.loadLibrary(Runtime.Java:366)
at Java.lang.System.loadLibrary(System.Java:989)
ライブラリは残念ながらクローズドソースです。ライブラリを64ビットターゲットで再コンパイルせずにこれを修正する方法はありますか?
AndroidにAPKをインストールすると、システムはAPKのlib
フォルダー内でネイティブライブラリディレクトリ(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips64、mips)を探します。 Build.SUPPORTED_ABIS
によって決定される順序。
アプリにarm64-v8a
ディレクトリがあり、ライブラリが欠落している場合、欠落しているライブラリは別のディレクトリからインストールされず、ライブラリは混在しません。つまり、アーキテクチャごとにライブラリの完全なセットを提供する必要があります。
したがって、問題を解決するには、ビルドから64ビットライブラリを削除するか、32ビットアーキテクチャのみをパッケージ化するようにabiFiltersを設定します。
Android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}