问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有没有一个配置或一个函数可以强制让android以32位加载动态库so文件

发布网友 发布时间:2022-05-29 19:38

我来回答

1个回答

热心网友 时间:2023-11-13 07:11

在Android中调用动态库文件(*.so)都是通过jni的方式,而且往往在apk或jar包中调用so文件时,都要将对应so文件打包进apk或jar包,工程目录下图:

以上方式的存在的问题:
  1、缺少灵活性比较类似静态加载了(不是静态加载),能加载的so文件绑定死了;
  2、但so文件很多或很大时,会导致对应的apk和jar包很大;
  3、不能动态的对so文件更新;

Android中加载so文件的提供的API:
void System.load(String pathName);

说明:
  1、pathName:文件名+文件路劲;
  2、该方法调用成功后so文件中的导出函数都将插入的系统提供的一个映射表(类型Map);

看到以上对System.load(String pathName);的函数说明可定有人会想到将so文件放到一个指定的目录然后再通过参数pathName直接引用该目录的路劲和对应的so文件问题不就解决了吗?
这里有个问题被忽略了,那就是System.load只能加载两个目录路劲下的so文件:
  1、/system/lib ;
  2、安装包的路劲,即:/data/data/<packagename>/…
而且这两个路劲又是有权限保护的不能直接访问;

问题解决方法:
先从网络下载so文件到手机目录(如:/test/device/test.so) –> 将test.so加载到内存(ByteArrayOutputStream) –> 然后保存到对用安装包目录;
具体代码如下:

try {
String localPath = Environment.getExternalStorageDirectory() + path;
Log.v(TAG, "LazyBandingLib localPath:" + localPath);

String[] tokens = mPatterns.split(path);
if (null == tokens || tokens.length <= 0
|| tokens[tokens.length - 1] == "") {
Log.v(TAG, "非法的文件路径!");
return -3;
}
// 开辟一个输入流
File inFile = new File(localPath);
// 判断需加载的文件是否存在
if (!inFile.exists()) {
// 下载远程驱动文件
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");
return 1;
}
FileInputStream fis = new FileInputStream(inFile);

File dir = context.getDir("libs", Context.MODE_PRIVATE);
// 获取驱动文件输出流
File soFile = new File(dir, tokens[tokens.length - 1]);
if (!soFile.exists()) {
Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists");
FileOutputStream fos = new FileOutputStream(soFile);
Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:"
+ tokens[tokens.length - 1]);

// 字节数组输出流,写入到内存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
// 从内存到写入到具体文件
fos.write(baos.toByteArray());
// 关闭文件流
baos.close();
fos.close();
}
fis.close();
Log.v(TAG, "### System.load start");
// 加载外设驱动
System.load(soFile.getAbsolutePath());
Log.v(TAG, "### System.load End");

return 0;

} catch (Exception e) {
Log.v(TAG, "Exception " + e.getMessage());
e.printStackTrace();
return -1;

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2023年辽宁高考399分能报哪些公办大学 额头有杂音是什么意思啊 ...反应也不是一般的迟钝,胆子还越来越小,叫我的声音稍大就会被吓... 2022天津理工大学各省录取分数线 ...一个是个胖子 一个是个小矮子 一个是个黄头发的男人 一个是个穿... 我是河南理科女今年考了545 报考天津理工大学一本希望大不?二本专业... ...一个是个胖子 一个是个小矮子 一个是个黄头发的男人 还有一个是个... 有个手机游戏 图标就是一个黄头发的人背着弓箭 游戏内容是两个人_百度... 我是男生从小就怕那些动物,比如青蛙,觉得一想青蛙的皮肤就全身鸡皮疙瘩... ...不是昆虫总动员,其中片段是,一群昆虫被青蛙吃进肚子里,它们在里面... android studio怎样导入.so文件 android studio 怎么导入.so文件 第一个字是应的成语 应四字成语有哪些 含&quot;应&quot;的成语 应的成语有哪些成语 1000V的电压通过稳压值为5V的稳压二极管输出电压是多少V?(电流在稳压管可承受范围) 重庆203中学的面积有多大.? 重庆滴203高中 我是新生,是住读好些还是走读? 重庆鱼洞中学好还是203中学? 重庆的203中学怎么样,最好是具体一点 很急。希望快一点!!谢谢了!!! 国内生物质电厂三大主机的主要供应商都有哪些? 韩国男生发型是怎样做的,详细说下 韩国男生中长发发型与中国男生的分别? 长安国际信托股份有限公司怎么样? 艾根加杞子泡酒可以喝吗 长安财通资产管理有限公司怎么样? 请问我老婆不接电话,短信不回~是不是她心里没有我了呀 陕西大唐长安资产管理有限公司怎么样? 老婆老是不回复信息是怎么回事?该甩了她吗? 柯南剧场版中基德的身世 名侦探柯南中基德偷过的宝石的名称,魔术快斗中的也要 怪盗基德到底在找什么宝石?具体一点。 电大开放本科考试资料 中国古代文学专题(2) 谁能说下基德的身世啊 鬼泣4RS是什么键 怪盗基德所要的宝石是什么? 怪盗基德一直在找什么样的宝石啊??.... 鬼泣4RS是什么按键 名侦探柯南里的基德的真实身份出来了没? 寻&lt;柯南&gt;中专门讲快斗(基德)的故事 关于基德的一些事 一般买注册会计师买什么样的辅导书 注会考试辅导书买什么比较好 注册会计师需要买哪几本书啊? 中国历史上三个千古一帝是什么? 中国历史上一共经历过几个王朝? 2010cpa书籍 中国历史上一个有多少个朝代 给个具体点的数字,并说明 柯南中.基德为什么要找宝石,那颗宝石究竟隐藏了什么?