JNI原理 System.loadLibrary源码分析

前言

本文介绍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
    JNI原理 System.loadLibrary源码分析_第1张图片JNI原理 System.loadLibrary源码分析_第2张图片
  • 可以通过反射打印下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()

你可能感兴趣的:(linux,c,c++,jni等,JNI,源码分析)