“dlopen失败:仅在测试中是32位而不是64位”

时间:2017-05-23 06:41:56

标签: android c++ android-ndk archlinux

我有一个使用基于c ++代码的核心模块的集合或Gradle模块:

  • Core(带有JNI粘合剂的C ++,带有aar的{​​{1}})
  • 测试(Android仪器测试)
  • App(常规Android应用)

libxyz-jni.so模块包含为Corelibxyz-jni.so编译的原生32位armeabi-v7a,并编译为x86。它没有aar个库。

arm64模块取决于App并正在使用Core硬件设备,没有任何问题(能够加载arm64

libxyz-jni.so取决于Tests,无法加载Corelibxyz-jni.so}并出现以下错误:

  

java.lang.UnsatisfiedLinkError:dlopen失败:“/ data / app / package.tests.test-2 / lib / arm / libxyz-jni.so”是32位而不是64位。

我已经检查过测试apk不包含除System.loadLibrary(..)armeabi-v7a之外的任何拱门。测试可以在Android模拟器中运行,但不能在64位硬件设备上使用Android Nougat。该应用程序可以在arm64设备上运行。

在加载库方面,这是测试和应用程序之间的区别吗?

1 个答案:

答案 0 :(得分:1)

您应该检查您的应用在运行时使用的库。您可以使用以下命令执行此操作:

# get your running pid
adb shell ps | grep <your package name> | tr -s ' ' |  cut -d ' ' -f 2 
32333
adb shell lsof | grep 32333 | grep so
.xxx 32333    u0_a222  mem       REG             259,30    133152       2629 /system/lib64/libcompiler_rt.so
.xxx 32333    u0_a222  mem       REG             259,30     30824       2759 /system/lib64/libmemalloc.so

正如您在本案中所看到的,Android已经加载了lib64库。如果您希望默认加载32位库,则需要在 APK 中使用lib / armeabi-v7a / lib.so。

如果您在APK中的其他位置拥有自己的库,并且您提取并动态加载,则Android将不知道它们是32位。