运行时如何追踪 System.loadLibrary 链接 DLLSO 的 native 方法调用过程?
- 内容介绍
- 相关推荐
本文共计812个文字,预计阅读时间需要4分钟。
System.loadLibrary()的本质,是让Java虚拟机(ART)在运行时定位并加载一个native动态链接库(.so文件),使其导出的函数能被JNI调用。这个过程并非简单的‘复制粘贴’,而是分阶段、有序、依赖类加载器和文件系统路径的协同流程。
第一步:名字转换与路径查找
调用 System.loadLibrary("native-lib") 时,Java 层不会直接找 “native-lib.so”。它先通过 System.mapLibraryName("native-lib") 转换为平台规范名 —— 在 Android 上就是 libnative-lib.so。接着交由当前 ClassLoader(通常是 PathClassLoader)执行 findLibrary() 方法查找该文件的绝对路径。
ClassLoader 默认会按顺序搜索以下位置(以 APK 安装后为例):
- /data/app/包名-xxx/lib/arm64/(对应 ABI 目录,如 arm64-v8a)
- /system/lib64/(系统级共享库路径)
- /vendor/lib64/
注意:PathClassLoader 自身未重写 findLibrary,实际委托给其父类 BaseDexClassLoader,最终遍历已注册的 native 库路径列表。
本文共计812个文字,预计阅读时间需要4分钟。
System.loadLibrary()的本质,是让Java虚拟机(ART)在运行时定位并加载一个native动态链接库(.so文件),使其导出的函数能被JNI调用。这个过程并非简单的‘复制粘贴’,而是分阶段、有序、依赖类加载器和文件系统路径的协同流程。
第一步:名字转换与路径查找
调用 System.loadLibrary("native-lib") 时,Java 层不会直接找 “native-lib.so”。它先通过 System.mapLibraryName("native-lib") 转换为平台规范名 —— 在 Android 上就是 libnative-lib.so。接着交由当前 ClassLoader(通常是 PathClassLoader)执行 findLibrary() 方法查找该文件的绝对路径。
ClassLoader 默认会按顺序搜索以下位置(以 APK 安装后为例):
- /data/app/包名-xxx/lib/arm64/(对应 ABI 目录,如 arm64-v8a)
- /system/lib64/(系统级共享库路径)
- /vendor/lib64/
注意:PathClassLoader 自身未重写 findLibrary,实际委托给其父类 BaseDexClassLoader,最终遍历已注册的 native 库路径列表。

