Android Studio 完美引用 so、arr、jar 包

      之前项目同时用到了这 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 目录下,点击同步按钮:

Android Studio 完美引用 so、arr、jar 包_第1张图片
*.jar

    1.1.2 同步成功后:

Android Studio 完美引用 so、arr、jar 包_第2张图片
*.jar

    1.2.1 右键add as library

Android Studio 完美引用 so、arr、jar 包_第3张图片
*.jar

    1.2.2 同步成功后

Android Studio 完美引用 so、arr、jar 包_第4张图片
*.jar

2、*.aar的引用:

    2.1.1 将 arr 包复制到 libs 目录下

Android Studio 完美引用 so、arr、jar 包_第5张图片
*.aar

   2.1.2、然后在 build.gradle 中添下面的代码:

Android Studio 完美引用 so、arr、jar 包_第6张图片
*.aar

3、*.so 的引用(两种方法):

   3.1.1 在项目 src/main/ 目录下创建文件夹 jniLibs (如果有就不需要创建了),将 so 文件复制到这个目录下即可,工程会自动加载src/main/jniLibs 目录下的 so 动态库。

Android Studio 完美引用 so、arr、jar 包_第7张图片
*.so

  3.2.1 在 libs 目录下放入对应不同 CPU 架构的 so 文件,通过加入代码: jniLibs.srcDir 'libs' 指向 so 路径为该 libs 路径开即可。

Android Studio 完美引用 so、arr、jar 包_第8张图片
*.so

三、坑:

    通过以上步骤和方法,顺利将*.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 再次编译,问题解决。

你可能感兴趣的:(Android Studio 完美引用 so、arr、jar 包)