【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )
文章目錄
- 一、 報(bào)錯(cuò)信息
- 二、 錯(cuò)誤分析
- 三、 報(bào)錯(cuò)時(shí)使用的 Gradle 和 Gradle 插件版本的配置
- 四、 修改方案
- 五、 總體分析
一、 報(bào)錯(cuò)信息
報(bào)錯(cuò)信息 :
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)二、 錯(cuò)誤分析
1 . 錯(cuò)誤分析 : 提示沒有在 /data/app/kim.hsl.rtmp-1/lib/x86, /system/lib, /vendor/lib 這幾個(gè)目錄中找到 NDK 的入口動(dòng)態(tài)庫 libnative-lib.so ;
2 . CPU 信息查看 : 使用 adb shell 進(jìn)入命令行 , 進(jìn)入 /proc 目錄 , 執(zhí)行 cat cpuinfo 命令 , 即可查看 CPU 架構(gòu)信息 , 運(yùn)行該應(yīng)用的手機(jī)是 AArch64 架構(gòu)的 ;
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上述手機(jī)是 ARM 64 位 , 需要配置 arm64-v8a 架構(gòu)的庫 ;
3 . 目前支持的架構(gòu)有 : arm64-v8a, armeabi-v7a, x86, x86_64 , 如果輸入其它架構(gòu) , 如 armeabi , 會(huì)報(bào)如下錯(cuò)誤 ;
ABIs [armeabi] are not supported for platform. Supported ABIs are [arm64-v8a, armeabi-v7a, x86, x86_64].4 . 建議配置 : 建議按照如下進(jìn)行配置 , 如果是使用 C/C++ 源碼開發(fā) , 沒有引入第三方的庫 , 建議都給配置上 ;
android {defaultConfig {externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'}}} } dependencies { }純代碼
三、 報(bào)錯(cuò)時(shí)使用的 Gradle 和 Gradle 插件版本的配置
1 . Gradle 及 Gradle 插件版本 : 下面的 Gradle 版本 是 gradle-5.6.4 , Gradle 插件版本是 gradle:3.6.1 , 這是創(chuàng)建工程時(shí)由 Android Studio 自動(dòng)生成 , 目前看來并不能適配當(dāng)前的 NDK 架構(gòu) ;
2 . 當(dāng)前的 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 . 當(dāng)前的 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 插件版本號后 , 編譯后 , 應(yīng)用正常運(yùn)行的 ;
這個(gè) Gradle 版本號 和 Gradle 插件版本號是之前開發(fā)該 NDK 項(xiàng)目時(shí)記錄下的版本信息 ;
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 插件版本號編譯的應(yīng)用 , 運(yùn)行機(jī)制不同 , 查找 NDK 動(dòng)態(tài)庫的機(jī)制也不同 ;
五、 總體分析
總體分析 :
① 開發(fā)新應(yīng)用 : 使用最新的 Gradle 和 Gradle 插件 , 開發(fā) NDK 應(yīng)用并沒有問題 ;
② 編譯已有應(yīng)用 : 只是使用最新的 Gradle 及插件 , 編譯之前配置的 NDK 代碼的配置方式 , 代碼依賴庫 , 構(gòu)建腳本等 , 需要修改 ;
③ 純源碼開發(fā) : 使用 C/C++ 源碼開發(fā)肯定是沒問題的 ;
④ 引用外部函數(shù)庫 : 如果引用外部的函數(shù)庫 , 如第三方靜態(tài)庫或動(dòng)態(tài)庫 , 其中的配置 , 預(yù)編譯選項(xiàng) , 構(gòu)建腳本 , 可能支持情況就不太一樣了 , 使用一些不太適合的 Gradle 版本可能無法編譯通過 , 或編譯出的版本無法運(yùn)行 ;
⑤ 當(dāng)前交叉編譯 CPU 架構(gòu)選擇 : 該 NDK 項(xiàng)目中引用了外部的靜態(tài)庫 , 和頭文件 , 需要配置預(yù)編譯選項(xiàng) , 但是在 Ubuntu 中只交叉編譯了 armeabi-v7a CPU 架構(gòu)的靜態(tài)庫 ;
⑥ 建議交叉編譯 CPU 架構(gòu)選擇 : 最新的 Gradle 和 Gradle 插件 , 編譯的應(yīng)用 , 必須在 Ubuntu 中交叉編譯時(shí) , 為各種 CPU 架構(gòu)都編譯出對應(yīng)的函數(shù)庫 ;
總結(jié)
以上是生活随笔為你收集整理的【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android RTMP】RTMPDu
- 下一篇: 【错误记录】Android NDK 错误