Java的本地方法在哪里定义?

我有安装在CentOS服务器上的JRE(1.6_34)的64位Linux发行版。 我拉下了源代码,并钻入java.net.SocketInputStream类。

该类有一个名为socketRead0的方法:

 /** * Reads into an array of bytes at the specified offset using * the received socket primitive. * @param fd the FileDescriptor * @param b the buffer into which the data is read * @param off the start offset of the data * @param len the maximum number of bytes read * @param timeout the read timeout in ms * @return the actual number of bytes read, -1 is * returned when the end of the stream is reached. * @exception IOException If an I/O error has occurred. */ private native int socketRead0(FileDescriptor fd, byte b[], int off, int len, int timeout) throws IOException; 

我在哪里可以find执行此SocketInputStream#socketRead0方法时执行的本机源代码? 提前致谢!

正如其他答案中所解释的, native方法实际上是通过JNI调用的C函数。 包含C函数的库文件通常用System.loadLibrary加载,并且遵循JNI命名方案(以Java_为前缀,随后是包,类和方法名,下划线而不是点)自动链接到那些native Java方法。

然而,其他答案并没有提到将C函数连接到native Java方法的第二种方法: RegisterNatives 。 这个接口可以用来提供C实现,而不用调用System.loadLibrary ,使用JNI命名方案甚至导出这些函数。

在OpenJDK中它是在这里出于某种原因,我不能找到Linux的实现。 通常搜索本机文件夹。 你的文件将在其中

native方法表示此方法不是Java代码,而是本地代码-aka机器代码 – 通常用C / C ++编写。 通过JNI调用这些函数。

您应该搜索它加载它使用的本地库的位置,如下所示

 System.loadLibrary("nameOfLibrary"); 

这个本地库应该为Java导出函数

 JNIEXPORT returnType JNICALL Java_ClassName_methodName