在 64 位設備(arm64 架構)上運行應用時拋出異常:
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/cn.********-1/lib/arm64/libGlobal.so" is 32-bit instead of 64-bit
錯誤信息明確指出:libGlobal.so 是 32 位庫,但應用嘗試在 64 位進程中加載它。Android 6.0+ 對 64 位支持更嚴格,若 APK 中包含 arm64-v8a 目錄,系統會優先嘗試加載 64 位庫;若該目錄下的 .so 實為 32 位編譯,即會拋出此錯誤。
大多數第三方 SDK 均提供多架構構建產物:
armeabi-v7a(32 位 ARM)arm64-v8a(64 位 ARM)x86、x86_64 等請聯繫 SDK 提供方或前往官網下載包含 arm64-v8a 目錄的完整版本,替換專案 jniLibs 中對應文件。
在 build.gradle 中配置 ndk.abiFilters 僅打包 32 位庫:
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a' // 僅打包 32 位 ARM
}
}
}
或在 Application.mk 指定:
APP_ABI := armeabi-v7a
缺點: 64 位設備將以 32 位兼容模式運行,無法發揮 64 位性能優勢,且未來 Android 版本可能棄用 32 位支持。
若暫無 64 位庫,可刪除 jniLibs/arm64-v8a 目錄,讓系統回退加載 armeabi-v7a 下的 32 位庫。但同樣屬臨時措施。