我有安装在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