web-dev-qa-db-ja.com

64ビットで32ビットネイティブライブラリを使用する方法Androidデバイス

私のアプリケーションでは、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ビットターゲットで再コンパイルせずにこれを修正する方法はありますか?

53
Philipp E.

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"
        }
    }
}
130
ph0b