android - 如何在 64 位 Android 设备上使用 32 位 native 库

标签 android android-ndk ndk-build

我在我的应用程序中使用了一个仅针对 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文件夹内寻找原生库目录(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips64、mips) APK,按 Build.SUPPORTED_ABIS 确定的顺序。

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

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

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

关于android - 如何在 64 位 Android 设备上使用 32 位 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30782848/

相关文章:

android - 使用 Cmake 和 Ninja 限制 ndkBuild 的 CPU 内核

android - 无法在 Android 上原生使用 'libnl'。无法使用 `genl_ctrl_resolve()` 获取 nl80211 驱动程序

android-ndk - 使用 android-ndk : There are no modules to build in this project 构建时出错

android - 在 Android 库项目中获取应用程序的上下文?

android - 我可以在 C 代码中调用 `Log.*` 吗?我想使用 LogCat 进行调试

android - 通过 PC 或其他智能手机远程启动和停止 Android 应用程序

android - native Android-加载共享库时,即使先前加载的共享库包含定义,也无法找到未定义的方法

android - 如何使用 NDK 将静态 c 库 (libsrtp) 添加到 Android 项目

Android studio 找不到 '.jar'文件中定义的符号

android - 如何在加载 Activity 时禁用网格项目