查找思路

  • native 方法的本地方法名遵循一定规则生成:
    • 前缀为 Java_
    • 完全限定的类名(包括包名和类的全路径),中间以 _ 分割
    • 方法名
    • 对于重载的 native 方法,方法名后要再跟上 __参数标签
  • 比如 String#intern() 方法的 native 方法名为 Java_java_lang_String_intern
  • 若在 Linux 使用 grep 命令查找相应的代码。
    • grep nr "Java_java_lang_String_intern"
  • 上面只找到入口并非实现,因此,需要到 HotSpot 目录下查找。

    • 两次使用 grep nr 命令在 HotSpot 目录下查找相应的源码实现。

      JDK 12

      目录说明

  • 源码存放在 src 目录下。

  • 一般先去 java.base 里面查找(这与 JDK 8 的不一样)
    • aix
    • linux
    • macosx
    • share
    • solaris
    • unix
    • windows
  • 通过上面可知,各个平台共性的代码会放在 share 路径下,而与平台相关的代码则放在各类系统对应的目录下。由于服务器一般部署的是 Linux 系统,因此,我们着重关注 linuxshareunix 三个目录下的文件。
  • 比如 sun.nio.ch.Net#bind0() native 方法的 JNI 定义在 jdk12\src\java.base\unix\native\libnio\ch\Net.c 中。