我尝试在Nexus 9上使用本机库运行应用程序。
应用程序退出并显示错误消息:
java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
此问题是否有任何已知的解决方法(当然,重新编译库并使apk更大)?
答案 0 :(得分:29)
找到一个解释:64位Android可以使用32位本机库作为后备,只有当System.loadlLibrary()在默认搜索路径中找不到更好的东西时。 如果强制系统使用带有完整库路径的System.load()加载32位库,则会出现UnsatisfiedLinkError。 所以第一个解决方法是使用System.loadLibrary()而不是System.load()。
必须考虑的另一件事是库不能混合:回退行为仅适用于应用程序加载的第一个库。如果第一个是64位,则同一个应用程序不能加载32位库,反之亦然。
答案 1 :(得分:12)
重点是将运行环境转换为32位
在 build.gradle
中添加以下内容defaultConfig:{ ... ndk { abiFilters" armeabi"," armeabi-v7a"," x86"," mips" } }
将android.useDeprecatedNdk=true
添加到 gradle.properties
.so
文件
进入新文件夹答案 2 :(得分:1)
答案 3 :(得分:0)
Nop,您需要让本机库与64位兼容才能工作。
请参阅官方文档:JNI Tips: 64-bit Considerations
答案 4 :(得分:0)
我遇到了同样的问题,当我从Android Studio 2.1更新到2.2.3(使用ndk v.13.1)时,谷歌中没有找到任何提示真的帮助了我(比如使用abiFilters,排除'lib / x86_64 / lib ... .so',LOCAL_MULTILIB:= 32,或TARGET_PREFER_32_BIT:= true,...)。
最后,我能够使用最新的AS v2.2.3再次使用它(在Android.mk或build.gradle中不做任何更改),只需使用我以前的ndk编译器,即android-ndk-r10e < / p>
我使用ndk-build手动为“armeabi-v7a”和“x86”手动构建了库,它在Android上使用arm64就像一个魅力。
答案 5 :(得分:0)
对我来说问题是我在应用程序的构建设置下启用了高级分析功能
答案 6 :(得分:0)
为我工作:
ndk {
abiFilters 'armeabi-v7a', 'x86'
}