【发布时间】:2015-05-31 15:41:10
【问题描述】:
我正在通过以下方式加载我的原生库:
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 实例时,我已经指定了本机代码所在的路径,即getDir("native", Context.MODE_PRIVATE)。
(我使用NDK release 10生成原生库。当原生代码文件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 位模式以适应该库。 stackoverflow.com/questions/27712921/… 建议安装程序在 APK 中仅检测到 32 位库时会出现这种情况。如果您找不到其他触发该模式的方法,您可能需要在实际 APK 中包含一个占位符 32 位库,以便安装程序查看和响应。最终,你能提供一个 64 位的库吗?
-
@ChrisStratton,感谢您的评论,我需要在 64 位目标上运行我的 32 位库,这是我现在想要实现的目标。
-
那么我建议你尝试在 apk 中放置一个虚拟的 32 位库。
-
@ChrisStratton,1. 如果我希望系统加载我真正的 32 位库,为什么我需要这个虚拟的 32 位库?我不明白。 2. 我怎样才能创建一个虚拟的 32-lib ??
-
你已经在stackoverflow.com/questions/28992323/…问过这个问题@不允许转发。
标签: android android-ndk java-native-interface