在64位android上使用32位jni库

时间:2014-11-28 10:06:38

标签: android java-native-interface 32bit-64bit

我尝试在Nexus 9上使用本机库运行应用程序。

应用程序退出并显示错误消息:

java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit

此问题是否有任何已知的解决方法(当然,重新编译库并使apk更大)?

7 个答案:

答案 0 :(得分:29)

找到一个解释:64位Android可以使用32位本机库作为后备,只有当System.loadlLibrary()在默认搜索路径中找不到更好的东西时。 如果强制系统使用带有完整库路径的System.load()加载32位库,则会出现UnsatisfiedLinkError。 所以第一个解决方法是使用System.loadLibrary()而不是System.load()。

必须考虑的另一件事是库不能混合:回退行为仅适用于应用程序加载的第一个库。如果第一个是64位,则同一个应用程序不能加载32位库,反之亦然。

答案 1 :(得分:12)

重点是将运行环境转换为32位

  1. build.gradle

    中添加以下内容

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

  2. android.useDeprecatedNdk=true添加到 gradle.properties

  3. 在libs下添加名为 armeabi 的新文件夹,然后复制一个32位.so文件         进入新文件夹

答案 2 :(得分:1)

https://source.android.com/source/64-bit-builds.html

在Android.mk中试试这个

LOCAL_MULTILIB := 32

答案 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'
    }