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

时间:2015-06-11 13:54:48

标签: android android-ndk ndk-build

我在我的应用程序中使用本机库,该库仅为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位目标重新编译库?

2 个答案:

答案 0 :(得分:124)

在Android上安装APK时,系统会在APK的lib文件夹中查找本机库目录(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips64,mips),按照Build.SUPPORTED_ABIS确定的顺序。

如果你的应用程序恰好有一个arm64-v8a目录,缺少libs,那么将不会从另一个目录安装缺少的lib,libs不会混合。这意味着您必须为每个体系结构提供完整的库集。

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

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

答案 1 :(得分:2)

以上答案将有助于生成仅32位而非64位的构建。如果使用[abiFilters“ armeabi”,“ armeabi-v7a”,“ x86”,“ mips”]。生成带符号的apk表示,不是64位。当我们上传到Google Play商店时,它将引发错误。它不是64位版本。