摘录


在能找到ClassLoader的情况下调用的顺序为:

System.loadLibrary Runtime.getRuntime().loadLibrary 构建本地文件系统和应用的库路径(在安装时,PMS会读取libs目录下的so文件,进行本地释放解压到指定目录)。拼接so的全称,匹配搜索so的全路径并返回 Runtime.getRuntime().doLoad():获取从当前加载的Classloader获取LD_LIBRARY_PATH路径,传入底层的nativeLoad 获取虚拟机对象并调用其内部的LoadNativeLibrary方法。 判断目标库是否已加载。如果已加载,判断加载的ClassLoader和本次的ClassLoader是否相同,如果不同,则警告。如果未加载,使用dlopen打开并加载目标库的本进程的虚拟地址空间中,返回handle句柄。如果打开失败(handle为null),使用nativeBridge做二次尝试加载(会有是否支持nativeBridge加载的判断)。 如果两次加载都失败,直接返回。 如果加载成功,开始创建一个共享库对象。因为是多线程,所以在创建完成后需要判断是否有其他线程先于我们加载完成。如果是,则释放本次的资源。否,则使用dlsym获取JNI_OnLoad的地址。 如果目标库不存在JNI_OnLoad,返回false 如果存在,则调用并执行JNI_OnLoad->RegisterNatives->dvmRegisterJNIMethod->dvmUseJNIBridge.也就是说上层调用RegisterNatives,传入一个gMethods方法数组,注册的具体实现由各个VM自己实现。在Dalvik中,会遍历gMethod,将每个方法都存储到DalvikBridge中,也就完成了这个方法的注册。这里的Bridge其实是处理多平台的情况。比如so是面向多个平台的,每个平台都针对so有一套解析,比如参数的处理、栈架构的虚拟机、寄存器架构的虚拟机等,所以每个平台都自行封装一个Bridge,实现必要的方法,从而与上下层链接起来。

点评

这篇文章还得深入看看,我的理解,所依赖的jar包(比如微博)可以放在系统目录下,这样大家就可以共享了,放在本身app里,不知道要怎么共享?

原文

点击这里查看原文

其它

本帖内容由21QA云收藏工具自动生成,欢迎使用。

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055

asked 09 Jun, 19:19

%E8%B7%AF%E4%BA%BA%E7%94%B2's gravatar image

路人甲
131569615787

Be the first one to answer this question!
toggle preview

powered by O*S*Q*A

粤ICP备14040061号-1