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

我在我的应用程序中使用了一个本地库,它只为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时,系统将按照Build.SUPPORTED_ABIS确定的顺序在APK的lib文件夹内查找本地库目录(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips64,mips) Build.SUPPORTED_ABIS

如果您的应用碰巧有一个缺lesslibs的arm64-v8a目录,那么缺less的libs将不会从另一个目录安装,这些libs不会混合在一起。 这意味着你必须为每个架构提供一整套你的库。

因此,要解决您的问题,您可以从构build中删除64位库,或将abiFilter设置为仅打包32位体系结构:

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