![](/img/trans.png)
[英]dlopen failed: “libarchitect.so” is 64-bit instead of 32-bit
[英]“dlopen failed: is 32-bit instead of 64-bit” in tests only
我有一個使用基於c ++代碼的核心模塊的集合或Gradle模塊:
aar
與libxyz-jni.so
) Core
模塊包括為armeabi-v7a
和x86
編譯的本機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-v7a
和x86
。 測試可以在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.