首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android SO 文件 32 位與 64 位兼容性問題解決

     編輯:程式設計疑難解答

錯誤現象

在 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 位編譯,即會拋出此錯誤。

解決方案

方案一:獲取對應架構的 64 位 .so 文件(推薦)

大多數第三方 SDK 均提供多架構構建產物:

  • armeabi-v7a(32 位 ARM)
  • arm64-v8a(64 位 ARM)
  • x86、x86_64 等

請聯繫 SDK 提供方或前往官網下載包含 arm64-v8a 目錄的完整版本,替換專案 jniLibs 中對應文件。

方案二:強制僅使用 32 位庫(臨時規避)

在 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 位庫。但同樣屬臨時措施。

最佳實踐建議

  1. 優先獲取官方 64 位 .so,保證原生性能與長期兼容
  2. 自行編譯開源庫時,配置工具鏈輸出多架構產物
  3. CI/CD 流程中加入架構檢查,防止錯誤打包
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved