之前项目同时用到了这 so、arr、jar 这三个包,扯淡的出现了很多未知错误,MMP 心很累,然后深入学习了一波,豁然大悟,好了不废话了,直入主题!
一、什么是 *.jar、*.arr、*.so 包:
1、 *.jar,JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。只包含了class 文件与清单文件 ,不包含资源文件,如图片等所有 res 中的文件。JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
2、*.arr,与 *.jar 不同的是,*.aar 文件中包含所有资源,class 文件以及 res 资源文件。
3、*.so ,文件是 unix 的动态连接库,二进制文件。SO 库本身不参与 APK 的编译过程,使用 JNI 调用 SO 库里的 Native 方法,进行NDK开发。
二、了解了以上概念,接下来就是如何使用:
1、 *.jar 的引用:
1.1.1 将 jar 包复制到 libs 目录下,点击同步按钮:
1.1.2 同步成功后:
1.2.1 右键add as library
1.2.2 同步成功后:
2、*.aar的引用:
2.1.1 将 arr 包复制到 libs 目录下
2.1.2、然后在 build.gradle 中添下面的代码:
3、*.so 的引用(两种方法):
3.1.1 在项目 src/main/ 目录下创建文件夹 jniLibs (如果有就不需要创建了),将 so 文件复制到这个目录下即可,工程会自动加载src/main/jniLibs 目录下的 so 动态库。
3.2.1 在 libs 目录下放入对应不同 CPU 架构的 so 文件,通过加入代码: jniLibs.srcDir 'libs' 指向 so 路径为该 libs 路径开即可。
三、坑:
通过以上步骤和方法,顺利将*.jar 、*.aar 、*.so 、引用到项目中。当时由于项目同时用到了这三种包,出现了引用错误:
“java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader..............couldn't find "xxxxxxx.so"”
接触过 Jni 的童靴看着这个 crash 相信会比较眼熟,对,就是so文件找不到,而引发的错误。当时遇到这个问题很疑惑,之前程序都是没有问题的,怎么会突然出现这样的问题,报错原因是找不到 aar 包中的 so 文件 。经过一步一步的分析和排查,问题原来是出现在引入 so 库之后。更为操蛋的事,他在编译的时候不会报错,只有在程序打开调用该 jni 的时候报错。你说操蛋不操蛋...
四、问题解决方案:
4.1、需要知道的是 so 库的使用本身就是一种最纯粹的动态加载技术,so 库本身不参与 APK 的编译过程,这下应该知道为啥编译时不出错了吧。
4.2、这个 Error“java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader..............couldn't find"xxxxxxx.so””,经过谷歌查阅,日志分析(独立开发者只有靠自己)...最终问题得以解决:
存在主要的原因是:aar
内部的 so cpu 支持框架与 so 本身 cpu 支持框架类型不同步,删除 aar 中不需要的 so 文件夹
“arm64-v8a”,“x86”,(根据自己实际情况增删)确保 aar 和 so 支持的 cpu 框架一致。ok 再次编译,问题解决。