查找思路
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中。
