3

我在 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;

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

4

3 回答 3

2

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

但是,其他答案没有提到将 C 函数链接到nativeJava 方法的第二种方法:RegisterNatives。该接口可用于提供 C 实现,而无需调用System.loadLibrary、使用 JNI 命名方案甚至导出这些函数。

于 2013-04-19T18:11:08.183 回答
1

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

于 2013-04-19T05:51:11.987 回答
0

方法native表明此方法不是 Java 代码,而是本机代码(也称为机器代码),通常用 C/C++ 编写。对此类函数的调用是通过JNI进行的。

您应该搜索它加载它使用的本机库的位置,看起来像

System.loadLibrary("nameOfLibrary");

这个本机库应该为 Java 导出函数,例如

JNIEXPORT returnType JNICALL Java_ClassName_methodName
于 2013-04-18T21:43:13.123 回答