需求很简单 ,就是加载指定文件夹下的.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相关推荐

  1. 在命令窗口执行java文件时,提示找不到或无法加载主类

    在命令窗口执行java文件时,提示找不到或无法加载主类 以前写java代码的时候,都是在Eclipse或者IDEA等集成开发工具上进行,所以编译和测试代码的时候都是一键执行,其中的原理简单来说,就是先 ...

  2. 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果

    [Java教程]iscroll5实现一个下拉刷新上拉加载的效果 0 2016-08-24 15:00:08 直接上代码!!! * { margin: 0; padding: 0; } ul, li { ...

  3. python win7正常的文件路径到win10报错_如何更改临时文件路径_win10怎么更改临时文件夹的路径图文步骤...

    2015-09-16 17:27:19 最近,有位win10系统用户反映自己电脑中的临时文件夹存放空间已经满了,因此想要更改掉之前的临时文件夹路径.这该如何操作呢?接下来,小编就向大家分享window ...

  4. mysql rpm包安装指定路径_安装rpm包时指定路径

    1.安装rpm包可以指定路径,但是安装包时它可能执行一些内置的命令.如果手动指定路径,可能造成部分功能失效 比如下面安装jdk的rpm包.默认安装后它会创建个软链接.下面就提示创建软链接失败了.但是不 ...

  5. 编写文件搜索小程序:1. 输入绝对路径以及搜索关键字,2. 搜索指定路径下(包括子文件夹)中名称包含关键字的所有文件并打印出,3. 将当前操作记录日志

    package com.homework;import java.io.File; import java.io.FileOutputStream; import java.io.IOExceptio ...

  6. 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll

    java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...

  7. java.library.path hadoop_java - Hadoop“无法为您的平台加载native-hadoop库”警告

    java - Hadoop"无法为您的平台加载native-hadoop库"警告 我目前正在运行CentOs的服务器上配置hadoop. 当我运行hadoop-env.sh或sto ...

  8. java环境变量详解---找不到或无法加载主类

    刚学java,配置好环境变量之后,在DOS下却运行java小程序却始终出现"找不到或无法加载主类"然后返回配置环境变量折腾了好久,查看书籍.网上的资料,最终OK了!安装Eclips ...

  9. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

最新文章

  1. 提供《华容道与数据结构》代码供测试
  2. python库--tensorflow--RNN(循环神经网络相关)
  3. 提高mysql查询速度_如何提高数据库查询速度
  4. ubuntu16.04装MatConvNet
  5. Java 8:从PermGen到元空间
  6. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
  7. java restful项目打包_66-JT项目04(项目打包发布/JSON/项目业务)
  8. 程序猿加班到深夜,你经历过没?
  9. 苹果电脑删除linux系统软件,mac删除双系统_mac删除双系统的win
  10. spring boot动力电池数据管理系统毕业设计源码301559
  11. 验证码识别登录:使用超级鹰(验证码识别第三方包)识别超级鹰网站登录
  12. SpringBoot整合MybatisPlus
  13. XenServer 7.0基础命令及故障处理办法
  14. 37.大数据之旅——网站流量统计项目
  15. AntV G6 自定义节点图形
  16. 认识一下,JavaScript今年25岁啦
  17. 大部分有高学历的人比低学历的人强
  18. xinetd使用指南
  19. DM9000C网卡驱动程序编写与测试
  20. 大数据、云计算、物联网、数据仓库、OLAP、OLTP、等大数据你必须知道并且了解的概念及相关关系,我的一些总结

热门文章

  1. nyoj 680 摘枇杷(二分+贪心)
  2. 机票预订系统活动图_机票预订系统详细设计
  3. 【机器学习】p3客户细分中的参考资料skewed distribution
  4. 虚拟逃避现实非常适合大流行,但虚拟现实似乎离主流技术还很远
  5. Ultraedit 26.0安装教程
  6. 容联领衔“科技金融50人”思辨 开启未来金融新征程
  7. 苏州python培训就业机构排名
  8. 毛概多项选择题答案统计程序
  9. One solution to error: “Failed to compile generated C file xsim.dir/ ... /xsim_1.c“
  10. win10系统更新后,网络连接显示正常(能登qq),但是所有浏览器都打不开网页,谷歌火狐显示代理拒接连接。