日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )

發布時間:2025/6/17 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【错误记录】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.zip

3 . 當前的 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.zip

2 . 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 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。