我有一个使用基于c ++代码的核心模块的集合或Gradle模块:
aar
的{{1}}) libxyz-jni.so
模块包含为Core
和libxyz-jni.so
编译的原生32位armeabi-v7a
,并编译为x86
。它没有aar
个库。
arm64
模块取决于App
并正在使用Core
硬件设备,没有任何问题(能够加载arm64
)
libxyz-jni.so
取决于Tests
,无法加载Core
(libxyz-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设备上运行。
在加载库方面,这是测试和应用程序之间的区别吗?
答案 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位。