searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Android系统加载native库的流程和原理分析(下)

2023-07-17 03:04:05
24
0

接着上篇“Android系统加载native库的流程和原理分析(上)” ,我们讲完native的加载流程。

 system.java中,loadLibrary函数就是我们直接在java中经常调用的函数,就是这个: 

public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
}
 
 然后调用到了runtime.java中: 
void loadLibrary0(ClassLoader loader, String libname) {
loadLibrary0(loader, null, libname);
}
 

我们注意到system.java中的传入的classLoader是通过反射来获取的Reflection.getCallerClass(),通过这个方法来获取的好处,可以知道当前APP运行的是32bit还是64bit的,后面我们跟踪debug也能发现,整个安卓这种会有classLoader两个对象,一个64位专门负责加载64位的jar或者库,而32位的专门用于加载32位的jar或者库。


回到我们追溯的librarySearchPath,我们去BaseDexClassLoader.java代码中去找,librarySearchPath也是别人传来的,那么到底是谁传进来的呢?
仔细查看 BaseDexClassLoader是继承自ClassLoader
public class BaseDexClassLoader extends ClassLoader
进入到ClassLoader.java中我们可以看到它是通过createSystemClassLoader来创建对应的loader

 

 

 

最后提两点疑问,有兴趣的可以去研究一下:)
1、LoadNativeLibrary中的线程使用的是Thread* self = Thread::Current() ,为何不直接用this?
2、LoadNativeLibrary 是通过什么方法来判断这个库已经加载到虚拟机了呢?

 

0条评论
0 / 1000