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

Android 5.0+ 閃退 UnsatisfiedLinkError:armeabi/armeabi-v7a 目錄與 .so 文件配置指南

     編輯:程式設計疑難解答

錯誤現象

App 在 Android 5.0+ 設備啟動閃退,Logcat 報:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file ...

提示找不到原生庫,常見原因是 libs/armeabi 或 libs/armeabi-v7a 目錄缺失或 .so 文件未正確打包。

目錄結構說明

Android Studio 項目中,原生庫放置於:

app/src/main/jniLibs/
├── arm64-v8a/
├── armeabi-v7a/
│   └── libyourlib.so
├── x86/
└── x86_64/
  • armeabi:舊版 32 位 ARM (ARMv5/ARMv6),已棄用,現代設備不再支持。
  • armeabi-v7a:32 位 ARMv7 (含 NEON),主流兼容架構。
  • arm64-v8a:64 位 ARMv8,現代旗艦機標配。

解決步驟

  1. 創建目錄:在 src/main/ 下新建 jniLibs 文件夾(AS 會自動識別),或在 build.gradle 指定:
    sourceSets { main { jniLibs.srcDirs = ['libs'] } }(若習慣用 libs 目錄)。
  2. 放置 .so 文件:將編譯好的 .so 按架構放入對應子目錄。至少提供 armeabi-v7a,建議補全 arm64-v8a。
  3. 檢查打包結果:Build → Analyze APK,查看 lib/ 目錄下是否包含對應架構的 .so。
  4. NDK 構建配置(若源碼編譯):
    android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' } } }

常見坑點

  • 僅提供 armeabi:64 位設備無法加載,導致 5.0+ 閃退。
  • 混用 jniLibs 與 jni 目錄:AS 3.0+ 標準為 jniLibs 放預編譯 .so,jni 放 CMake/ndk-build 源碼。
  • 依賴庫缺失:.so 依賴其他系統庫(如 libgnustl_shared.so),需確保依賴也被打包或系統存在。

總結

Android 5.0+ 要求 64 位支持,必須提供 armeabi-v7a 及 arm64-v8a 的 .so 文件,放置於 src/main/jniLibs/對應架構/ 目錄。棄用 armeabi,正確配置 NDK abiFilters,即可解決 UnsatisfiedLinkError。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved