簡體   English   中英

“dlopen失敗:僅在測試中是32位而不是64位”

[英]“dlopen failed: is 32-bit instead of 64-bit” in tests only

我有一個使用基於c ++代碼的核心模塊的集合或Gradle模塊:

  • 芯(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失敗:“/ data / app / package.tests.test-2 / lib / arm / libxyz-jni.so”是32位而不是64位。

我檢查過測試apk不包含任何拱,除了armeabi-v7ax86 測試可以在Android模擬器中運行,但不能在64位硬件設備上使用Android Nougat。 該應用程序可以在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位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM