android - java.lang.UnsatisfiedLinkError when loading native library in Android 5.0

标签 android android-ndk java-native-interface

<分区>

我正在通过以下方式加载我的原生库:

try {
       System.loadLibrary("myNative");
} catch (UnsatisfiedLinkError e) {
       //java.lang.UnsatisfiedLinkError here
       System.load("/data/data/com.my.app/app_native/libmyNative.so");
}

以上代码最终打包成Jar文件。

在另一个项目中,我用 DexClassLoader 加载上面的 Jar :

DexClassLoader dexClassLoader = new DexClassLoader(jarPath,
                    optJarPath,
                    getDir("native", Context.MODE_PRIVATE),
                    getClassLoader());

注意,在构造这个dexClassLoader实例时,我指定了native代码所在的路径,即getDir("native", Context.MODE_PRIVATE )

(我正在使用 NDK release 10 生成 native 库。当生成 native 代码文件 libmyNative.so 时,我的 java 代码(打包到最终 Jar)检查 CPU 架构类型 &将正确的复制到 getDir("native", Context.MODE_PRIVATE).)

以上代码在除 Android 5.0 Lollipop 以外的其他设备上运行良好。在 Android 5.0 Lollipop 设备上运行时,我不断收到以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.my.app/app_native/libmyNative.so" is 32-bit instead of 64-bit
at java.lang.Runtime.load(Runtime.java:331)
at java.lang.System.load(System.java:982)

如何解决这个问题?

最佳答案

您似乎正试图在 64 位目标上使用 32 位库。如果您不能提供 64 位的,则必须说服 Android 回退到 32 位模式以容纳该库。

显然,兼容模式(源似乎称它为 ABI 覆盖)通常在安装时设置,安装程序发现只有 32 位(而不是 64 位)库可用。但在您的情况下,该库在安装时不可见,因此无法正常工作。

如果您在 apk 中放置一个最符合 64 位设备需求的“虚拟”32 位库,那么系统将希望将您的应用配置为在 32 位兼容模式下运行,以便稍后加载您真正的 32 位库实际上可以工作。

我不知道 32 位库是否需要是一个真实的库还是一个具有正确位置和合理名称的空文件,但是来自 ndk 示例文件夹的 libhello-jni.so 的 hello-jni 项目应该应该工作。您不需要任何相应的 Java 代码,只需拥有安装程序可以发现的 native 库(但是,将其作为测试调用可能不是一个坏主意)。

可能有一些其他方式来触发它,例如 list 中的某些内容(尽管文档中未提及任何内容)。我不太可能怀疑运行时的任何措施都会起作用,因为这种模式可能已经在您的任何代码运行之前就已确定(看起来您实际上可能最终会在这样的系统上运行两个 zygote 实例,一个 64 位,另一个 32 位,其想法是应用程序由认为合适的任何一个启动。

关于android - java.lang.UnsatisfiedLinkError when loading native library in Android 5.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29298522/

相关文章:

Android ndk找不到符号 "sigemptyset"

java - 返回在 JNI 中创建的对象时的 NewGlobalRef/DeleteGlobalRef

java - Android 应用程序出错

android - 使用 Android 进行热插拔调试

android - 如何在 Andengine Base 游戏 Activity 中使用 Ratio Resolution 策略时覆盖 onSetContentView

java - java和ntdll.dll之间的关系

java - JNI 库分析

将 sqlite 数据库发送到服务器的 Android 实用程序

java - 如何从android中的帧缓冲区创建一个png图像

android - 使用 NDK 编译会出现成功包含头文件的错误