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 目录下,点击同步按钮:



     

      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 再次编译,问题解决。



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值