Android将so库封装到jar包中并加载其中的so库

之前写过将jar包和so库封装到jar包中的文章,但是没有考虑别人调用时需要加载so库的问题。因为so库放入jar之后,so就不是一个独立的.so文件了,用System.load()加载就会提示找不到这个库,所以要想加载这个so 就需要把so 从jar 中提取出来,保存为临时文件,然后再加载。但是不能直接提取.so文件,需要把.so文件改成.jet文件封装到jar中,再进行提取拷贝。

如何建立一个项目以及项目的结构还有模块我就不说,可以看我之前的文章:Android 将module中的jar、so包打包成jar或者aar文件
我这里只是对so库封装到jar包做一些修改,这样方便后续项目加载so库。

1.将so后缀改成.jet,然后放到下图目录中,如果有多个cpu架构可以放多个。再新建SysLoad.java类,这个类可以不用写代码。

2.修改build.gradle文件task makeJar(type: Jar)方法

apply plugin: 'com.android.library'
android {compileSdkVersion 29defaultConfig {minSdkVersion 22targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}sourceSets {main {
//            jni.srcDirs = []
//                jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的so存放路径}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}lintOptions {abortOnError false}}task makeJar(type: Jar){//删除存在的delete 'build/libs/newsdk.jar'  //删除存在的archivesBaseName = 'newsdk'  //输出的jar包名称from(project.zipTree('build/intermediates/packaged-classes/release/classes.jar'))from(project.zipTree('build/intermediates/packaged-classes/release/libs/AMap_Search_V7.1.0_20191030.jar')) //需要打包的第三方jar包
//        from fileTree(dir: "src/main/java", include: "**/*.so") //把src/main/java目录下包含的所有.so文件封装到jar包from fileTree(dir: "src/main/java", include: "**/*.jet") //把src/main/java目录下包含的所有.jet文件封装到jar包destinationDir = file('build/libs')  //打成jar包后存放的文件目录}makeJar.dependsOn(build)
}dependencies {testImplementation 'junit:junit:4.12'implementation files('libs/AMap_Search_V7.1.0_20191030.jar')
}

3.点击makejar编译出jar包,将其引入到项目中,打开可以看到里面包含了a.jet和b.jet文件,如下图。

4.在项目中通过Java代码加载jar中的so库,这里只展示加载a.so库。原理:获取a.jet的文件流,再把文件流输入到临时文件a.so中, System.load()方法加载a.so文件(简单点说,就是把a.jet文件拷贝出来),这样就可以了。

static {try {InputStream is = null;is =  SysLoad.class.getResourceAsStream("/com/example/libraryb/arm64-v8a/a.jet");File tempFile = File.createTempFile("a", ".so");FileOutputStream fos = new FileOutputStream(tempFile);int i;byte[] buf = new byte[1024];while ((i = is.read(buf)) != -1) {fos.write(buf, 0, i);}is.close();fos.close();System.load(tempFile.getAbsolutePath());} catch (IOException e) {e.printStackTrace();}}

注意:提取a.jet文件时,要注意改一下/com/example/libraryb/arm64-v8a/a.jet路径,改成你自己的。

Android将so库封装到jar包中并加载其中的so库相关推荐

  1. java动态打jar包_java动态加载jar包

    目录结构如下. ├── main │   ├── java │   │   └── lu │   │   └── tool │   │   └── jar │   │   ├── InterfaceR ...

  2. flink sql udf jar包_Java动态加载Jar实例解析

    导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景.如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用.下面将举一个简 ...

  3. flink sql udf jar包_FlinkSQL 动态加载 UDF 实现思路

    导读: 最近在对 Flink 进行平台化,基于 REST API 构建一个平台实现通过纯 SQL 化编写和管理 Job.尽管 Flink官方希望用户将所有的依赖和业务逻辑打成一个fat jar,这样方 ...

  4. android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件

    Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...

  5. 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )

    文章目录 安卓直播推流专栏博客总结 一. x264 编码后的 H.264 数据帧 二. RTMP 协议中 关键帧 / 非关键帧 数据格式 说明 三. 判定 H.264 帧数据分隔符 四. 初始化 RT ...

  6. android自定义控件 jar,Android Studio引用自定义的framework.jar包

    1.在app/libs/目录下添加framework.jar包. 2.打开build->Edit Libraries and Dependencies,把libs/framework.jar放到 ...

  7. 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 封装 SPS / PPS 数据包 )

    文章目录 一. 基本封装数据格式说明 二. 封装 SPS PPS 数据总体说明 三. 封装头数据 四. 封装 SPS 数据 五. 封装 PPS 数据 六. 设置 RTMP 数据包其它参数 七. SPS ...

  8. android studio 集成 第三方sdk,Android FrameWork集成第三方SDK的jar包和so庫

    本文講解的如何在Android FrameWork如何集成XXXsdk的jar包和so庫 首先在framework/opt/建立XXSDK的文件夾講jar包和so庫拷貝進去 1:framework/o ...

  9. 封装成jar包_通用源码阅读指导mybatis源码详解:io包

    io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...

最新文章

  1. 【每日一算法】杨辉三角到底是什么?
  2. 【转载】3389远程终端常用CMD命令
  3. mysql8集群的优点_介绍 MySQL 8 中值得关注的新特性和改进。
  4. 页面初始加载的是默认刷新一次(f5)
  5. 【报错】:Char 5: error: non-void f
  6. C语言结构体描述BMP的文件格式
  7. codeforces 318A-C语言解题报告
  8. 分享一个数据产品经理的PRD
  9. 大数据Hadoop2.x与Hadoop3.x相比较有哪些变化
  10. Jupyter Notebooks的安装和使用介绍
  11. 【观点讨论与支撑】明星和成功人士真的就只有成功的一面吗?背后的心酸和痛苦的经历我感觉更重要!
  12. 微信小程序video标签大小设置
  13. Android开发之自定义DataTimePicker(日期时间选择器)
  14. WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”
  15. Node.js Kubernetes Graceful Shutdown
  16. java jks 转pfx_JKS、BKS、PFX证书格式之间转换
  17. JSP页面传值方法总结
  18. Android模仿今日头条搜索页
  19. js/jq 倒计时插件(一)
  20. 基于Fisco-Bcos的区块链智能合约-简单案例实践

热门文章

  1. 2022年全球市场锁相放大器模块总体规模、主要生产商、主要地区、产品和应用细分研究报告
  2. Unity+EasyAR4.1.0.811包,实现手机扫描图片显示模型(安卓手机)
  3. android qq pad,腾讯QQ for Pad Android版本体验
  4. 红蓝对抗系列之浅谈蓝队反制红队的手法一二
  5. python和c++哪个好-Scratch和Python与C++三种编程语言选哪个好
  6. 模型的鲁棒性和泛化性
  7. CS230 Full-cycle DL progjects
  8. 每日一笑 | 不忘初心,最爱扫雷~
  9. 购买SOLIDWORKS正版软件需要注意哪些问题
  10. 域用户如何批量修改服务器时间,如何批量修改word中的域