我在我的应用程序中使用了一个仅针对 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/