前言
本文介绍System.loadLibrary原理。
Java层源码流程
System#loadLibrary
-> Runtime#loadLibrary0
–> BaseDexClassLoader#findLibrary
–> DexPathList#findNativeLibrary
->Runtime#nativeLoad,走向c层源码
- 主要是从
nativeLibraryPathElements
中找到so路径,遍历所有路径找到存在的so,不存在则抛出UnsatisfiedLinkError
。在c层进行打开so逻辑,如果c层返回false,就会拼接error字符串,Java层收到后也会抛出UnsatisfiedLinkError
。
- 可以通过反射打印下nativeLibraryPathElements,以更好的理解这块代码
Field pathListF = BaseDexClassLoader.class.getDeclaredField("pathList");
pathListF.setAccessible(true);
ClassLoader dexPathClassLoader = TestSocketFragment.class.getClassLoader();
Object pathList = pathListF.get(dexPathClassLoader);
Field nativeLibraryPathElementsF = Class.forName("dalvik.system.DexPathList").getDeclaredField("nativeLibraryPathElements");
nativeLibraryPathElementsF.setAccessible(true);
Object nativeLibraryPathElements = nativeLibraryPathElementsF.get(pathList);
android.util.Log.e("mLogU", nativeLibraryPathElements.toString()