某些情况下安卓引入so冲突的解决
前言
年前在做一个项目的时候,为了减小apk的大小,所以就把除了'armeabi'的so都给删了,经测试无不良情况.
前一段时间又要改某个sdk,换了一个so库,必须要用64位的(arm64v8a),由于项目时间长了,换了次svn地址,所以就悲剧了,项目以前的64位so都被删了也找不回来了,而新so库必须要用64位的,这下就有问题了(加入arm64v8a,就需要其他so也支持64位的,直接把64位的放到armabi下引入会报错)
解决方案
后来想到loadLibrary的方法有两个:
1.System.loadLibrary
该方法直接去jniLibs文件夹内寻找so并加载.
比如:jniLibs/armabi/libSDK.so 调用方法为:System.loadLibrary("SDK"); 需要掐头去尾
2.System.load
该方法可以加载本地File路径的形式加载
于是可以把so文件放在本地,一般来说一种通过网络下载到本地,另一种通过assets资源文件的形式复制到本地,我选用第二种方式
代码实现
assets资源拷贝到本地的工具类
import android.content.Context;
import android.content.res.AssetManager;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;public class AssetCopyer {private String asset_list_fileName;private final Context mContext;private final AssetManager mAssetManager;private File mAppDirectory;public AssetCopyer(Context context, String asset_list_fileName) {mContext = context;mAssetManager = context.getAssets();this.asset_list_fileName = asset_list_fileName;}/*** 将assets目录下指定的文件拷贝到sdcard中** @return 文件列表
// * @return 是否拷贝成功, true 成功;false 失败* @throws IOException*/public List<File> copy() throws IOException {List<String> srcFiles = new ArrayList<>();//获取系统在SDCard中为app分配的目录,eg:/sdcard/Android/data/$(app's package)//该目录存放app相关的各种文件(如cache,配置文件等),unstall app后该目录也会随之删除mAppDirectory = mContext.getExternalFilesDir(null);if (null == mAppDirectory) {return null;}//读取assets/$(subDirectory)目录下的assets.lst文件,得到需要copy的文件列表List<String> assets = getAssetsList();for (String asset : assets) {//如果不存在,则添加到copy列表if (!new File(mAppDirectory, asset).exists()) {srcFiles.add(asset);}}List<File> fileList=new ArrayList<>();//依次拷贝到App的安装目录下for (String file : srcFiles) {fileList.add(copy(file));}return fileList;}/*** 获取需要拷贝的文件列表(记录在assets/assets.lst文件中)** @return 文件列表* @throws IOException*/protected List<String> getAssetsList() throws IOException {List<String> files = new ArrayList<>();/*InputStream listFile = mAssetManager.open(new File(asset_list_fileName).getPath());BufferedReader br = new BufferedReader(new InputStreamReader(listFile));String path;while (null != (path = br.readLine())) {files.add(path);}*/ //todo 懒省事,就不用资源内的文件,而是直接用so文件名字进行拼接了for (String s : asset_list_fileName.split("##"))files.add(s);return files;}/*** 执行拷贝任务** @param asset 需要拷贝的assets文件路径* @return 拷贝成功后的目标文件句柄* @throws IOException*/protected File copy(String asset) throws IOException {InputStream source = mAssetManager.open(new File(asset).getPath());File destinationFile = new File(mAppDirectory, asset);if (destinationFile.exists()) {return destinationFile;}destinationFile.getParentFile().mkdirs();OutputStream destination = new FileOutputStream(destinationFile);byte[] buffer = new byte[1024];int nread;while ((nread = source.read(buffer)) != -1) {if (nread == 0) {nread = source.read();if (nread < 0)break;destination.write(nread);continue;}destination.write(buffer, 0, nread);}destination.close();return destinationFile;}
}
先把有相应的so文件放入assets文件夹中
然后调用工具类拷贝so文件,调用System.load()方法来加载相应的so文件
String files = "libIAL.so##libSDL.so";List<File> copy = new AssetCopyer(context, files).copy();for (File f : copy)System.load(f.getAbsolutePath());
然后成功的引入了so文件
某些情况下安卓引入so冲突的解决相关推荐
- ⽬标⾏动及稠密环境未知情况下,⽆⼈机跟踪的系统解决⽅案
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文是对<Fast-Tracker:A Robust Aerial System for Tra ...
- 织梦 php版本,织梦DEDECMS在PHP版本高于5.5的情况下无法使用关键词內链的解决方法...
织梦DEDECMS在PHP版本高于5.5的情况下无法使用关键词內链的解决方法: 打开/include/arc.archives.class.php 找到 找到: $body = @preg_repla ...
- 如何在零停机的情况下迁移 Kubernetes 集群
作者:顾静(子白)|阿里云高级研发工程师:谢瑶瑶(初扬)|阿里云技术专家 导语: 随着云原生理念在企业中的深入和践行,应用容器化的比例大幅提升.是否可以保证应用容器化迁移过程中的平稳切换,保证应用不停 ...
- yiilite.php,缓存 - yii在哪些情况下可以加载yiilite.php?
yii权威指南上说,在开启apc缓存的情况下,可以加载yiilite.php提升性能.我有以下几点疑问: 1.开启apc缓存的情况下,引入yiilite.php能提升性能的原因是因为缓存了opcode ...
- element-ui 按需加载情况下覆盖预置scss变量
element-ui的默认主题theme-chalk是通过scss预编译的,可以通过修改scss变量达到修改主题的目的. 在项目中改变 SCSS 变量 Element 的 theme-chalk 使用 ...
- SpringBootTest单元测试—加入@Test无法启动测试方法,什么情况下需要加@RunWith(SpringRunner.class)?
spring环境下单元测试: SpringBoot环境下单元测试: 一.SpringBoot2.4.0之后 二.2.2.0 < SpringBoot < 2.4. 三.SpringBoot ...
- 安装mysql没有密码_如何在没有密码提示的情况下安装MySQL?
问题描述 我试图在没有密码提示的情况下在Ubuntu Natty上安装MySQL.但是,在主安装后的某个阶段,我总是不断提示输入密码. 另外,当我输入我认为应该是我的密码(mymysqlpass)的密 ...
- 《攻防演练》在没有基础安全能力的情况下如何做好蓝队防守
目的: 1.净化企业或机构的网络环境.强化网络安全意识: 2.防攻击.防破坏.防泄密.防重大网络安全故障: 3.检验企业关键基础设施的安全防护能力: 4.提升关键基础设施的网络安全防范能力和水平. 现 ...
- Git 冲突的解决方法
作者:Kichirin 链接:https://www.jianshu.com/p/9382a0e3402a 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Git在p ...
最新文章
- C++中#error/assert/static_assert的区别及使用
- 50 调度器事件监听
- jsp cookie 中文乱码 的解决方法
- Jzoj5234 外星人的路径
- strstr和memcmp函数的实现
- STL vector容器
- javadoc maven_Maven Fluido Skin和Javadoc类图
- flatpickr功能强大的日期时间选择器插件
- “双十一”即将来临,先来看看快递物流企业的大数据
- arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
- ue4 如何获取端口号_尝试在UE4.22中实现罪恶装备Xrd的卡通渲染
- View DrawingCache的理解
- H3C 模拟器 pc与防火墙,交换机相连,在pc cmd下用telnet访问交换机和防火墙
- python反射实例化_python3 反射的四种基本方法解析
- DELL服务器装机网络问题
- ffmpeg命令基本语法和常见命令
- 实验一 结构化分析(软件工程)
- 【Unity3D】动态更换天空盒(场景不受天空盒影响 等问题)
- VB程序VB代码:摄像头视频图像的监控,截图,录像(改进)
- 关于虚拟机IP更改问题教给大家一个必杀技
热门文章
- 文巾解题 面试题 01.04. 回文排列
- python零碎知识(8):UserDict 类
- 新手入门深度学习 | 第六篇:TensorFlow2 回调极速入门
- 一、简谈Pandas
- eclispe使用外部tomcat总结
- 使用 Spring 2.5 基于注解驱动的 Spring MVC--转
- weblogic cluster error-----Could not= open connection with host: 127.0.0.1
- Lesson 14.1 数据归一化与Batch Normalization理论基础
- 【风险管理】系统技术框架
- Sentinel: 分布式系统的流量防卫兵 1