查找思路
native
方法的本地方法名遵循一定规则生成:- 前缀为
Java_
- 完全限定的类名(包括包名和类的全路径),中间以
_
分割 - 方法名
- 对于重载的 native 方法,方法名后要再跟上
__
和参数标签
- 前缀为
- 比如
String#intern()
方法的native
方法名为Java_java_lang_String_intern
。 - 若在
Linux
使用grep
命令查找相应的代码。grep nr "Java_java_lang_String_intern"
上面只找到入口并非实现,因此,需要到
HotSpot
目录下查找。源码存放在
src
目录下。- 一般先去
java.base
里面查找(这与JDK 8
的不一样)- aix
linux
- macosx
share
- solaris
unix
- windows
- 通过上面可知,各个平台共性的代码会放在
share
路径下,而与平台相关的代码则放在各类系统对应的目录下。由于服务器一般部署的是Linux
系统,因此,我们着重关注linux
、share
、unix
三个目录下的文件。 - 比如
sun.nio.ch.Net#bind0()
native 方法的JNI
定义在jdk12\src\java.base\unix\native\libnio\ch\Net.c
中。