java loadlibrary 路径_android loadlibrary 更改libPath 路径,指定路径加载.so
需求很简单 ,就是加载指定文件夹下的.so。
原因:android在程序运行的状态下 ,无法在 data/data/packageName/lib 下写文件,但可读。
还有一个引申的问题:data/app-lib/packageName/ 下的.so 和 data/data/packageName/lib 的.so 是什么关系?
1 . 获取全局的classloader
PathClassLoader pathClassLoader = (PathClassLoader)context.getClassLoader();
DexClassLoader myDexClassLoader = new DexClassLoader(str, context.getDir("dex", 0).getAbsolutePath(), str, context.getClassLoader().getParent());
2 . 获取pathList
Object pathList = getPathList(pathClassLoader);
3 . 添加路径
File[] file = new File[]{
new File("/data/app-lib/pakageName-1"),
new File("/data/app-lib/pakageName-2"),
new File("/data/data/pakageName/files"),
new File("/vendor/lib"),
new File("/system/lib")
} ;
4 . 获取当前类的属性
Object nativeLibraryDirectories=pathList.getClass().getDeclaredField("nativeLibraryDirectories");
((Field)nativeLibraryDirectories).setAccessible(true);
5 . 设置新的路径
((Field)nativeLibraryDirectories).set(pathList, file);
6 . 对classloader的操作,对应于BaseDexClassLoader:
public BaseDexClassLoader(String dexPath,File optimizedDirectory,String libraryPath,ClassLoader parent){
super(parent);
this.pathList=new DexPathList(this,dexPath,libraryPath,optimizedDirectory);
}
7 . dex,library路径对应于DexPathList, 这部分和热补丁密切相关,有兴趣可以搜下hotfix ,很多开源项目。
privatefinalElement[]dexElements; //这部分就是dex分包的了,热补丁,热补丁,热补丁
privatefinalFile[]nativeLibraryDirectories;//这部分就是 libs 加载路径了,默认有 /vendor/lib system/lib data/app-lib/packageName
最后给下代码:
public static void initNativeDirectory(Application application) {
if (hasDexClassLoader()) {
try {
createNewNativeDir(application);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void createNewNativeDir(Context context) throws Exception{
PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader();
Object pathList = getPathList(pathClassLoader);
//获取当前类的属性
Object nativeLibraryDirectories = pathList.getClass().getDeclaredField("nativeLibraryDirectories");
((Field) nativeLibraryDirectories).setAccessible(true);
//获取 DEXPATHList中的属性值
File[] files1 = (File[])((Field) nativeLibraryDirectories).get(pathList);
Object filesss = Array.newInstance(File.class, files1.length + 1);
//添加自定义.so路径
Array.set(filesss, 0, new File(context.getFilesDir().getAbsolutePath()));
//将系统自己的追加上
for(int i = 1;i
Array.set(filesss,i,files1[i-1]);
}
// File[] filesss = new File[file.length+ files1.length];
// filesss[0] = file[0];
// for(int i = 1;i < files1.length+1;i++){
// filesss[i] = files1[i];
// }
((Field) nativeLibraryDirectories).set(pathList, filesss);
}
private static Object getPathList(Object obj) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
return getField(obj, Class.forName("dalvik.system.BaseDexClassLoader"), "pathList");
}
private static Object getField(Object obj, Class cls, String str) throws NoSuchFieldException, IllegalAccessException {
Field declaredField = cls.getDeclaredField(str);
declaredField.setAccessible(true);
return declaredField.get(obj);
}
/**
* 仅对4.0以上做支持
* @return
*/
private static boolean hasDexClassLoader() {
try {
Class.forName("dalvik.system.BaseDexClassLoader");
return true;
} catch (ClassNotFoundException var1) {
return false;
}
}
参考链接
java loadlibrary 路径_android loadlibrary 更改libPath 路径,指定路径加载.so相关推荐
- 在命令窗口执行java文件时,提示找不到或无法加载主类
在命令窗口执行java文件时,提示找不到或无法加载主类 以前写java代码的时候,都是在Eclipse或者IDEA等集成开发工具上进行,所以编译和测试代码的时候都是一键执行,其中的原理简单来说,就是先 ...
- 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果
[Java教程]iscroll5实现一个下拉刷新上拉加载的效果 0 2016-08-24 15:00:08 直接上代码!!! * { margin: 0; padding: 0; } ul, li { ...
- python win7正常的文件路径到win10报错_如何更改临时文件路径_win10怎么更改临时文件夹的路径图文步骤...
2015-09-16 17:27:19 最近,有位win10系统用户反映自己电脑中的临时文件夹存放空间已经满了,因此想要更改掉之前的临时文件夹路径.这该如何操作呢?接下来,小编就向大家分享window ...
- mysql rpm包安装指定路径_安装rpm包时指定路径
1.安装rpm包可以指定路径,但是安装包时它可能执行一些内置的命令.如果手动指定路径,可能造成部分功能失效 比如下面安装jdk的rpm包.默认安装后它会创建个软链接.下面就提示创建软链接失败了.但是不 ...
- 编写文件搜索小程序:1. 输入绝对路径以及搜索关键字,2. 搜索指定路径下(包括子文件夹)中名称包含关键字的所有文件并打印出,3. 将当前操作记录日志
package com.homework;import java.io.File; import java.io.FileOutputStream; import java.io.IOExceptio ...
- 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll
java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...
- java.library.path hadoop_java - Hadoop“无法为您的平台加载native-hadoop库”警告
java - Hadoop"无法为您的平台加载native-hadoop库"警告 我目前正在运行CentOs的服务器上配置hadoop. 当我运行hadoop-env.sh或sto ...
- java环境变量详解---找不到或无法加载主类
刚学java,配置好环境变量之后,在DOS下却运行java小程序却始终出现"找不到或无法加载主类"然后返回配置环境变量折腾了好久,查看书籍.网上的资料,最终OK了!安装Eclips ...
- java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...
最新文章
- 提供《华容道与数据结构》代码供测试
- python库--tensorflow--RNN(循环神经网络相关)
- 提高mysql查询速度_如何提高数据库查询速度
- ubuntu16.04装MatConvNet
- Java 8:从PermGen到元空间
- Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
- java restful项目打包_66-JT项目04(项目打包发布/JSON/项目业务)
- 程序猿加班到深夜,你经历过没?
- 苹果电脑删除linux系统软件,mac删除双系统_mac删除双系统的win
- spring boot动力电池数据管理系统毕业设计源码301559
- 验证码识别登录:使用超级鹰(验证码识别第三方包)识别超级鹰网站登录
- SpringBoot整合MybatisPlus
- XenServer 7.0基础命令及故障处理办法
- 37.大数据之旅——网站流量统计项目
- AntV G6 自定义节点图形
- 认识一下,JavaScript今年25岁啦
- 大部分有高学历的人比低学历的人强
- xinetd使用指南
- DM9000C网卡驱动程序编写与测试
- 大数据、云计算、物联网、数据仓库、OLAP、OLTP、等大数据你必须知道并且了解的概念及相关关系,我的一些总结
热门文章
- nyoj 680 摘枇杷(二分+贪心)
- 机票预订系统活动图_机票预订系统详细设计
- 【机器学习】p3客户细分中的参考资料skewed distribution
- 虚拟逃避现实非常适合大流行,但虚拟现实似乎离主流技术还很远
- Ultraedit 26.0安装教程
- 容联领衔“科技金融50人”思辨 开启未来金融新征程
- 苏州python培训就业机构排名
- 毛概多项选择题答案统计程序
- One solution to error: “Failed to compile generated C file xsim.dir/ ... /xsim_1.c“
- win10系统更新后,网络连接显示正常(能登qq),但是所有浏览器都打不开网页,谷歌火狐显示代理拒接连接。