Android将so库封装到jar包中并加载其中的so库
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库相关推荐
- java动态打jar包_java动态加载jar包
目录结构如下. ├── main │ ├── java │ │ └── lu │ │ └── tool │ │ └── jar │ │ ├── InterfaceR ...
- flink sql udf jar包_Java动态加载Jar实例解析
导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景.如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用.下面将举一个简 ...
- flink sql udf jar包_FlinkSQL 动态加载 UDF 实现思路
导读: 最近在对 Flink 进行平台化,基于 REST API 构建一个平台实现通过纯 SQL 化编写和管理 Job.尽管 Flink官方希望用户将所有的依赖和业务逻辑打成一个fat jar,这样方 ...
- android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件
Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...
- 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )
文章目录 安卓直播推流专栏博客总结 一. x264 编码后的 H.264 数据帧 二. RTMP 协议中 关键帧 / 非关键帧 数据格式 说明 三. 判定 H.264 帧数据分隔符 四. 初始化 RT ...
- android自定义控件 jar,Android Studio引用自定义的framework.jar包
1.在app/libs/目录下添加framework.jar包. 2.打开build->Edit Libraries and Dependencies,把libs/framework.jar放到 ...
- 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 封装 SPS / PPS 数据包 )
文章目录 一. 基本封装数据格式说明 二. 封装 SPS PPS 数据总体说明 三. 封装头数据 四. 封装 SPS 数据 五. 封装 PPS 数据 六. 设置 RTMP 数据包其它参数 七. SPS ...
- android studio 集成 第三方sdk,Android FrameWork集成第三方SDK的jar包和so庫
本文講解的如何在Android FrameWork如何集成XXXsdk的jar包和so庫 首先在framework/opt/建立XXSDK的文件夾講jar包和so庫拷貝進去 1:framework/o ...
- 封装成jar包_通用源码阅读指导mybatis源码详解:io包
io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...
最新文章
- 【每日一算法】杨辉三角到底是什么?
- 【转载】3389远程终端常用CMD命令
- mysql8集群的优点_介绍 MySQL 8 中值得关注的新特性和改进。
- 页面初始加载的是默认刷新一次(f5)
- 【报错】:Char 5: error: non-void f
- C语言结构体描述BMP的文件格式
- codeforces 318A-C语言解题报告
- 分享一个数据产品经理的PRD
- 大数据Hadoop2.x与Hadoop3.x相比较有哪些变化
- Jupyter Notebooks的安装和使用介绍
- 【观点讨论与支撑】明星和成功人士真的就只有成功的一面吗?背后的心酸和痛苦的经历我感觉更重要!
- 微信小程序video标签大小设置
- Android开发之自定义DataTimePicker(日期时间选择器)
- WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”
- Node.js Kubernetes Graceful Shutdown
- java jks 转pfx_JKS、BKS、PFX证书格式之间转换
- JSP页面传值方法总结
- Android模仿今日头条搜索页
- js/jq 倒计时插件(一)
- 基于Fisco-Bcos的区块链智能合约-简单案例实践
热门文章
- 2022年全球市场锁相放大器模块总体规模、主要生产商、主要地区、产品和应用细分研究报告
- Unity+EasyAR4.1.0.811包,实现手机扫描图片显示模型(安卓手机)
- android qq pad,腾讯QQ for Pad Android版本体验
- 红蓝对抗系列之浅谈蓝队反制红队的手法一二
- python和c++哪个好-Scratch和Python与C++三种编程语言选哪个好
- 模型的鲁棒性和泛化性
- CS230 Full-cycle DL progjects
- 每日一笑 | 不忘初心,最爱扫雷~
- 购买SOLIDWORKS正版软件需要注意哪些问题
- 域用户如何批量修改服务器时间,如何批量修改word中的域