运行时如何追踪 System.loadLibrary 链接 DLLSO 的 native 方法调用过程?

2026-04-30 16:550阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计812个文字,预计阅读时间需要4分钟。

运行时如何追踪 System.loadLibrary 链接 DLL/SO 的 native 方法调用过程?

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 链接 DLL/SO 的 native 方法调用过程?

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 库路径列表。

阅读全文