如何在64位Android设备上使用32位本机库
我在应用程序中使用一个本机库,该库仅针对armeabi、armeabi-v7a和x86编译 当此库加载到64位设备(如三星S6)上时,应用程序会因未满足的链接错误而崩溃如何在64位Android设备上使用32位本机库,android,android-ndk,ndk-build,Android,Android Ndk,Ndk Build,我在应用程序中使用一个本机库,该库仅针对armeabi、armeabi-v7a和x86编译 当此库加载到64位设备(如三星S6)上时,应用程序会因未满足的链接错误而崩溃 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2
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时,系统会在APK的
lib
文件夹中查找本机库目录(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips64、mips),按照Build.SUPPORTED\u ABIS
确定的顺序
如果您的应用程序恰好有一个arm64-v8a
目录缺少libs,那么缺少的libs将不会从另一个目录安装,libs不会混合。这意味着您必须为每个体系结构提供全套库
因此,为了解决您的问题,您可以从构建中删除64位lib,或者将abiFilters设置为仅打包32位体系结构:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
上面的答案将有助于生成仅使用32位而不是64位的构建。如果您使用的是[ABI过滤器“armeabi”、“armeabi-v7a”、“x86”、“mips”]。生成有符号apk意味着,这不是64位的。当我们上传到Google Play商店时,会出现一个错误。它不是64位版本。您看过和吗?我看过。一个应用于AOSP,另一个应用于动态类加载。我的情况实际上要简单得多。但我刚刚发现,我包含的另一个本机库确实提供了64位.so文件,因此在最后一个apk中的my/lib文件夹中有一个arm64-86文件夹。可能这就是为什么系统假设我在所有情况下都提供64位.so文件。我将尝试仅使用32位支持重新编译这个库,看看它是否有效。好主意。让我们知道(如果需要,回答您自己的问题)。看起来不错,64位文件夹随此片段一起消失。一旦找到64位手机,我会将答案标记为已接受,以复制设置错误。当前插件中不推荐NDK集成。考虑尝试新的实验插件。添加<代码> Android。使用UpDebug RealNDK=真/<代码>到一个名为GealLe.Projts的文件,在项目的根目录下。顺便说一句,使用不推荐的集成也不必感到不快,因为使用abiFilters仍然是atm从APK中过滤出64位LIB的最干净的方法。从今天(2019年8月1日)起,如果没有64位体系结构,您无法向Google Play Store提交APK。