【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )
文章目錄
- 一、 報錯信息
- 二、 錯誤分析
- 三、 報錯時使用的 Gradle 和 Gradle 插件版本的配置
- 四、 修改方案
- 五、 總體分析
一、 報錯信息
報錯信息 :
2020-06-14 12:11:46.782 4528-4528/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: kim.hsl.rtmp, PID: 4528java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/kim.hsl.rtmp-1/base.apk"],nativeLibraryDirectories=[/data/app/kim.hsl.rtmp-1/lib/x86, /system/lib, /vendor/lib]]] couldn't find "libnative-lib.so"at java.lang.Runtime.loadLibrary0(Runtime.java:984)at java.lang.System.loadLibrary(System.java:1530)at kim.hsl.rtmp.LivePusher.<clinit>(LivePusher.java:13)at kim.hsl.rtmp.MainActivity.onCreate(MainActivity.java:73)at android.app.Activity.performCreate(Activity.java:6679)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)at android.app.ActivityThread.-wrap12(ActivityThread.java)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:154)at android.app.ActivityThread.main(ActivityThread.java:6119)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)二、 錯誤分析
1 . 錯誤分析 : 提示沒有在 /data/app/kim.hsl.rtmp-1/lib/x86, /system/lib, /vendor/lib 這幾個目錄中找到 NDK 的入口動態庫 libnative-lib.so ;
2 . CPU 信息查看 : 使用 adb shell 進入命令行 , 進入 /proc 目錄 , 執行 cat cpuinfo 命令 , 即可查看 CPU 架構信息 , 運行該應用的手機是 AArch64 架構的 ;
1|walleye:/proc $ cat cpuinfo Processor : AArch64 Processor rev 4 (aarch64) processor : 0 BogoMIPS : 38.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 CPU implementer : 0x51 CPU architecture: 8 CPU variant : 0xa CPU part : 0x801 CPU revision : 4上述手機是 ARM 64 位 , 需要配置 arm64-v8a 架構的庫 ;
3 . 目前支持的架構有 : arm64-v8a, armeabi-v7a, x86, x86_64 , 如果輸入其它架構 , 如 armeabi , 會報如下錯誤 ;
ABIs [armeabi] are not supported for platform. Supported ABIs are [arm64-v8a, armeabi-v7a, x86, x86_64].4 . 建議配置 : 建議按照如下進行配置 , 如果是使用 C/C++ 源碼開發 , 沒有引入第三方的庫 , 建議都給配置上 ;
android {defaultConfig {externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'}}} } dependencies { }純代碼
三、 報錯時使用的 Gradle 和 Gradle 插件版本的配置
1 . Gradle 及 Gradle 插件版本 : 下面的 Gradle 版本 是 gradle-5.6.4 , Gradle 插件版本是 gradle:3.6.1 , 這是創建工程時由 Android Studio 自動生成 , 目前看來并不能適配當前的 NDK 架構 ;
2 . 當前的 Gradle 版本配置 :
#Tue Jun 09 14:15:37 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip3 . 當前的 Gradle 插件版本配置 :
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.6.1'} } allprojects {repositories {google()jcenter()} } task clean(type: Delete) {delete rootProject.buildDir }四、 修改方案
修改 Gradle 版本號 , 和 Gradle 插件版本號后 , 編譯后 , 應用正常運行的 ;
這個 Gradle 版本號 和 Gradle 插件版本號是之前開發該 NDK 項目時記錄下的版本信息 ;
1 . 修改后的 Gradle 版本號 : 回退 Gradle 版本號至 gradle-5.1.1 ;
#Mon Sep 17 16:57:27 CST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip2 . Gradle 插件版本號 : 回退 Gradle 插件版本號至 3.4.1 ;
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.4.1'} } allprojects {repositories {google()jcenter()} } task clean(type: Delete) {delete rootProject.buildDir }目前看來 , 不同 Gradle 版本號 , 與不同 Gradle 插件版本號編譯的應用 , 運行機制不同 , 查找 NDK 動態庫的機制也不同 ;
五、 總體分析
總體分析 :
① 開發新應用 : 使用最新的 Gradle 和 Gradle 插件 , 開發 NDK 應用并沒有問題 ;
② 編譯已有應用 : 只是使用最新的 Gradle 及插件 , 編譯之前配置的 NDK 代碼的配置方式 , 代碼依賴庫 , 構建腳本等 , 需要修改 ;
③ 純源碼開發 : 使用 C/C++ 源碼開發肯定是沒問題的 ;
④ 引用外部函數庫 : 如果引用外部的函數庫 , 如第三方靜態庫或動態庫 , 其中的配置 , 預編譯選項 , 構建腳本 , 可能支持情況就不太一樣了 , 使用一些不太適合的 Gradle 版本可能無法編譯通過 , 或編譯出的版本無法運行 ;
⑤ 當前交叉編譯 CPU 架構選擇 : 該 NDK 項目中引用了外部的靜態庫 , 和頭文件 , 需要配置預編譯選項 , 但是在 Ubuntu 中只交叉編譯了 armeabi-v7a CPU 架構的靜態庫 ;
⑥ 建議交叉編譯 CPU 架構選擇 : 最新的 Gradle 和 Gradle 插件 , 編譯的應用 , 必須在 Ubuntu 中交叉編譯時 , 為各種 CPU 架構都編譯出對應的函數庫 ;
總結
以上是生活随笔為你收集整理的【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android RTMP】RTMPDu
- 下一篇: 【错误记录】Android NDK 错误