在64位android上使用32位jni库

G B*_*G B 28 java-native-interface android 32bit-64bit

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

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

java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
Run Code Online (Sandbox Code Playgroud)

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

G B*_*G B 30

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

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

  • 没关系,原因是其他的(在这种情况下要记住检查):我们向项目中添加了一个依赖于 JNI 库的模块。这个库支持 64 位,在这种情况下,兼容性回退被禁用。 (2认同)

小智 13

关键是将运行环境转换为32位

  1. build.gradle中添加以下内容

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

  2. 添加android.useDeprecatedNdk=truegradle.properties中

  3. 在libs下添加名为armeabi的新文件夹,然后将32位.so文件复制到新文件夹中

  • 从2019年8月1日起,我们必须遵循Google政策中规定的64位准则。通过执行上述步骤,play store将显示警告 (4认同)
  • 从哪里可以下载 32 位 .so 文件? (2认同)
  • Android是否会在19年8月之后阻止它作为完整的64位要求来解决? (2认同)

小智 5

这对我有用:

 ndk {
        abiFilters 'armeabi-v7a', 'x86'
    }
Run Code Online (Sandbox Code Playgroud)