文章目录

  • 一、 报错信息
  • 二、 错误分析
  • 三、 报错时使用的 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 )相关推荐

  1. android studio项目改成android.mk编译APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

    android9系统android studio项目改成用android.mk编译v7包--APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.Pat ...

  2. java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file /data/app/com.

    错误提示: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/dat ...

  3. android模拟器运行出现异常java.lang.UnsatisfiedLinkError,couldn't find libhyphenate.so

    模拟器运行的时候,出现异常如下: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file ...

  4. Android解决调用JNI报java.lang.UnsatisfiedLinkError: No implementation found for的错误

    最近公司项目需求接入即时通讯功能,现在第三方的即时通讯做的比较完善,接入也很方便.最近在调试语音的时候遇到了一个.so库加载失败的问题,在网上查看都是说由于原有项目的so库和新添加的model的so库 ...

  5. 解决Android编译时出现的java.lang.UnsatisfiedLinkError问题!

    https://blog.csdn.net/asla_1/article/details/80534589

  6. java.lang.unsatisfiedlinkerror:_java.lang.UnsatisfiedLinkError 解决方法

    就像这样的错误 Java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList[[zip file "/ ...

  7. 解决java.lang.UnsatisfiedLinkError

    解决Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file &qu ...

  8. java.lang.UnsatisfiedLinkError报错

    具体报错为:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/dat ...

  9. 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )

    文章目录 一.报错信息 二.解决方案 ( Android Studio 配置外部 so 动态库两种方法 ) 1.jniLibs 目录存放 2.libs 目录存放 一.报错信息 外部引用 so 动态库 ...

最新文章

  1. linux centos7如何格式化磁盘,Linux CentOS 7 磁盘格式化mke2fs、mkfs.ext4、磁盘挂载及手动增加swap空间...
  2. leetcode算法题--不同路径2
  3. leetcode 205. 同构字符串
  4. linux timespec 链接库,Linux内核 timespec_sub()
  5. c语言生日创意代码_用C语言写个代码,利用空格和符号拼写出生日快乐之类的...
  6. 金蝶kiss对计算机软件的要求,金蝶软件的产品适用范围分析
  7. 手把手教你部署Nagios
  8. Unsafe与CAS
  9. 思维导图MindManager:大脑思维发散和归纳的工具
  10. 小程序调用腾讯视频插件
  11. JavaScript系列-闭包
  12. 春运正当时 古代人们又是靠什么出行的呢?
  13. 私有化完成 360回归A股还有哪些障碍?
  14. 奥沙利文独家授权数字藏品正式发售 线上线下搭配多款专属福利
  15. 6-2 使用函数输出指定范围内Fibonacci数的个数 (20 分)
  16. [转载]用树莓派3配置成无线路由器
  17. ev6 ev8 ev4a加密视频破解翻录提取教程
  18. Decode函数的基本理解与简单应用
  19. Android实现QQ分享功能
  20. 如何对pdf进行编辑修改linux,Xournal: 随心编辑PDF

热门文章

  1. Imagine,is real crazy!
  2. No identifier specified for entity
  3. Luogu 1541 乌龟棋
  4. Win7命令终端基础配色指南
  5. jzoj C组 2017.1.19 比赛
  6. usb-to-isp-for-stm32
  7. mongodb 安装、开启服务 和 php添加mongodb扩展
  8. Sum-product Networks
  9. 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
  10. idea中maven导入jar包