文章目录
一、 报错信息
二、 错误分析
三、 报错时使用的 Gradle 和 Gradle 插件版本的配置
四、 修改方案
五、 总体分析
一、 报错信息
报错信息 :
2020-06-14 12:11:46.782 4528-4528/? E/AndroidRuntime: FATAL EXCEPTION: main Process: kim.hsl.rtmp, PID: 4528 java.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 架构都编译出对应的函数库 ;