如何在 64 位 Android 设备上使用 32 位本机库

How to use 32-bit native libraries on 64-bit Android device

我在我的应用程序中使用了一个仅为 armeabi、armeabi-v7a 和 x86 编译的本机库。

当这个库加载到像三星 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 时,系统将在lib APK 文件夹,顺序由 Build.SUPPORTED_ABIS 决定。

如果您的应用碰巧有一个缺少库的 arm64-v8a 目录,则不会从另一个目录安装缺少的库,库不会混合。这意味着您必须为每种架构提供全套库。

因此,要解决您的问题,您可以从构建中删除 64 位库,或将 abiFilters 设置为仅打包 32 位架构:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

以上答案将有助于生成 32 位版本而非 64 位版本。如果您使用 [ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" ]。 generate signed apk 意味着,这不是 64 位的。当我们上传到 Google Play 商店时,它会引发错误。它不是 64 位版本。