gpt4 book ai didi

android - "dlopen failed: is 32-bit instead of 64-bit"仅在测试中

转载 作者:太空狗 更新时间:2023-10-29 13:52:42 55 4
gpt4 key购买 nike

我有一组或 Gradle 模块,它们使用基于 C++ 代码的核心模块:

  • 核心(C++ 与 JNI 胶水,aarlibxyz-jni.so)
  • 测试(Android 仪器测试)
  • 应用(常规 Android 应用)

Core 模块包括为 armeabi-v7ax86 编译的原生 32 位 libxyz-jni.so 和被编译成aar。它没有 arm64 库。

App 模块依赖于 Core 并在 arm64 硬件设备上正常工作(能够加载 libxyz-jni .so)

Tests 依赖于 Core 并且无法加载 libxyz-jni.so(使用 System.loadLibrary(..)) 出现以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/package.tests.test-2/lib/arm/libxyz-jni.so" is 32-bit instead of 64-bit.

我已经检查过测试 apk 不包含除 armeabi-v7ax86 之外的任何架构。测试可以在 android 模拟器中运行,但不能在装有 Android Nougat 的 64 位硬件设备上运行。该应用程序可以在 arm64 设备上运行。

这就是测试和应用在加载库方面的区别?

最佳答案

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

# 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 位的。

关于android - "dlopen failed: is 32-bit instead of 64-bit"仅在测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44127527/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com