前言

年前在做一个项目的时候,为了减小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冲突的解决相关推荐

  1. ⽬标⾏动及稠密环境未知情况下,⽆⼈机跟踪的系统解决⽅案

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文是对<Fast-Tracker:A Robust Aerial System for Tra ...

  2. 织梦 php版本,织梦DEDECMS在PHP版本高于5.5的情况下无法使用关键词內链的解决方法...

    织梦DEDECMS在PHP版本高于5.5的情况下无法使用关键词內链的解决方法: 打开/include/arc.archives.class.php 找到 找到: $body = @preg_repla ...

  3. 如何在零停机的情况下迁移 Kubernetes 集群

    作者:顾静(子白)|阿里云高级研发工程师:谢瑶瑶(初扬)|阿里云技术专家 导语: 随着云原生理念在企业中的深入和践行,应用容器化的比例大幅提升.是否可以保证应用容器化迁移过程中的平稳切换,保证应用不停 ...

  4. yiilite.php,缓存 - yii在哪些情况下可以加载yiilite.php?

    yii权威指南上说,在开启apc缓存的情况下,可以加载yiilite.php提升性能.我有以下几点疑问: 1.开启apc缓存的情况下,引入yiilite.php能提升性能的原因是因为缓存了opcode ...

  5. element-ui 按需加载情况下覆盖预置scss变量

    element-ui的默认主题theme-chalk是通过scss预编译的,可以通过修改scss变量达到修改主题的目的. 在项目中改变 SCSS 变量 Element 的 theme-chalk 使用 ...

  6. SpringBootTest单元测试—加入@Test无法启动测试方法,什么情况下需要加@RunWith(SpringRunner.class)?

    spring环境下单元测试: SpringBoot环境下单元测试: 一.SpringBoot2.4.0之后 二.2.2.0 < SpringBoot < 2.4. 三.SpringBoot ...

  7. 安装mysql没有密码_如何在没有密码提示的情况下安装MySQL?

    问题描述 我试图在没有密码提示的情况下在Ubuntu Natty上安装MySQL.但是,在主安装后的某个阶段,我总是不断提示输入密码. 另外,当我输入我认为应该是我的密码(mymysqlpass)的密 ...

  8. 《攻防演练》在没有基础安全能力的情况下如何做好蓝队防守

    目的: 1.净化企业或机构的网络环境.强化网络安全意识: 2.防攻击.防破坏.防泄密.防重大网络安全故障: 3.检验企业关键基础设施的安全防护能力: 4.提升关键基础设施的网络安全防范能力和水平. 现 ...

  9. Git 冲突的解决方法

    作者:Kichirin 链接:https://www.jianshu.com/p/9382a0e3402a 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Git在p ...

最新文章

  1. C++中#error/assert/static_assert的区别及使用
  2. 50 调度器事件监听
  3. jsp cookie 中文乱码 的解决方法
  4. Jzoj5234 外星人的路径
  5. strstr和memcmp函数的实现
  6. STL vector容器
  7. javadoc maven_Maven Fluido Skin和Javadoc类图
  8. flatpickr功能强大的日期时间选择器插件
  9. “双十一”即将来临,先来看看快递物流企业的大数据
  10. arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
  11. ue4 如何获取端口号_尝试在UE4.22中实现罪恶装备Xrd的卡通渲染
  12. View DrawingCache的理解
  13. H3C 模拟器 pc与防火墙,交换机相连,在pc cmd下用telnet访问交换机和防火墙
  14. python反射实例化_python3 反射的四种基本方法解析
  15. DELL服务器装机网络问题
  16. ffmpeg命令基本语法和常见命令
  17. 实验一 结构化分析(软件工程)
  18. 【Unity3D】动态更换天空盒(场景不受天空盒影响 等问题)
  19. VB程序VB代码:摄像头视频图像的监控,截图,录像(改进)
  20. 关于虚拟机IP更改问题教给大家一个必杀技

热门文章

  1. 文巾解题 面试题 01.04. 回文排列
  2. python零碎知识(8):UserDict 类
  3. 新手入门深度学习 | 第六篇:TensorFlow2 回调极速入门
  4. 一、简谈Pandas
  5. eclispe使用外部tomcat总结
  6. 使用 Spring 2.5 基于注解驱动的 Spring MVC--转
  7. weblogic cluster error-----Could not= open connection with host: 127.0.0.1
  8. Lesson 14.1 数据归一化与Batch Normalization理论基础
  9. 【风险管理】系统技术框架
  10. Sentinel: 分布式系统的流量防卫兵 1