如何从JDK(SocketChannelImpact和SocketDispatcher)更改Java本机代码(C实现)并重新编译以与JDK一起使用?

如何从JDK(SocketChannelImpact和SocketDispatcher)更改Java本机代码(C实现)并重新编译以与JDK一起使用?,java,jvm,real-time,nio,Java,Jvm,Real Time,Nio,我需要从SocketDispatcher.java中找到、重新编译并在Linux上运行的JDK上部署以下本机方法: 本机方法位于下面代码的底部,请向下滚动 package sun.nio.ch; import java.io.*; /** * Allows different platforms to call different native methods * for read and write operations. */ class SocketDispatcher ext

我需要从SocketDispatcher.java中找到、重新编译并在Linux上运行的JDK上部署以下本机方法: 本机方法位于下面代码的底部,请向下滚动

package sun.nio.ch;

import java.io.*;

/**
 * Allows different platforms to call different native methods
 * for read and write operations.
 */

class SocketDispatcher extends NativeDispatcher
{

    static {
        IOUtil.load();
    }

    int read(FileDescriptor fd, long address, int len) throws IOException {
        return read0(fd, address, len);
    }

    long readv(FileDescriptor fd, long address, int len) throws IOException {
        return readv0(fd, address, len);
    }

    int write(FileDescriptor fd, long address, int len) throws IOException {
        return write0(fd, address, len);
    }

    long writev(FileDescriptor fd, long address, int len) throws IOException {
        return writev0(fd, address, len);
    }

    void preClose(FileDescriptor fd) throws IOException {
        preClose0(fd);
    }

    void close(FileDescriptor fd) throws IOException {
        close0(fd);
    }

    //-- Native methods
    static native int read0(FileDescriptor fd, long address, int len)
        throws IOException;

    static native long readv0(FileDescriptor fd, long address, int len)
        throws IOException;

    static native int write0(FileDescriptor fd, long address, int len)
        throws IOException;

    static native long writev0(FileDescriptor fd, long address, int len)
        throws IOException;

    static native void preClose0(FileDescriptor fd) throws IOException;

    static native void close0(FileDescriptor fd) throws IOException;
}
资料来源:

所以基本上我想让本机方法write0从本机write0!打印Hello

问题:

Linux的write0的C/C++代码在哪里

如何重新编译gcc命令行?Linux上写0的C/C++代码

如何启动JVM并使其在Linux上使用新编译的本机代码进行write0

Linux上没有本机SocketDispatcher实现。它是Windows特定的类;在Linux上,只需使用FileDispatcherImpl即可

FileDispatcherImpl的本机代码位于OpenJDK solaris目录中,代表POSIX代码,因此Linux实现也在其中

如果要重写本机方法,则必须使用自己的实现创建一个共享库。随后是本机方法名称,例如FileDispatherImpl.write0的本机函数应具有以下签名:

JNIEXPORT jint JNICALL
Java_sun_nio_ch_FileDispatcherImpl_write0(JNIEnv *env, jclass clazz,
                              jobject fdo, jlong address, jint len)
一旦您构建了自己的共享库并覆盖了一个或多个函数,就可以使用预加载,JVM将在JDK的任何本机代码之前链接您的函数。顺便说一句,用于FileDispatcherImpl和其他java.nio内容的JDK本机程序是在libnio中实现的。因此,Linux上没有本机SocketDispatcher实现。它是Windows特定的类;在Linux上,只需使用FileDispatcherImpl即可

FileDispatcherImpl的本机代码位于OpenJDK solaris目录中,代表POSIX代码,因此Linux实现也在其中

如果要重写本机方法,则必须使用自己的实现创建一个共享库。随后是本机方法名称,例如FileDispatherImpl.write0的本机函数应具有以下签名:

JNIEXPORT jint JNICALL
Java_sun_nio_ch_FileDispatcherImpl_write0(JNIEnv *env, jclass clazz,
                              jobject fdo, jlong address, jint len)

一旦您构建了自己的共享库并覆盖了一个或多个函数,就可以使用预加载,JVM将在JDK的任何本机代码之前链接您的函数。顺便说一下,FileDispatcherImpl和其他java.nio文件的JDK原生版本是libnio.so。

谢谢,但我想重新编译文件src/solaris/native/sun/nio/ch/FileDispatcherImpl.c,而不是从头开始编写自己的实现。所以我想复制FileDispatcher.c中的所有内容,更改一些小东西,重新编译并重写。@LatencyFighter然后您将不得不构建整个OpenJDK。我只想重新编译该特定方法的代码,以便从write向控制台打印Hello!方法执行其已执行的操作之前的消息。我可以使用LD_预加载。我想挑战在于如何编译?、使用什么命令行、它需要什么依赖关系等等@LatencyFighter如果您只想预先完成一些操作,就不需要复制原始源文件。通过调用dlsymRTLD_NEXT,…gcc-shared-fPIC-I$JAVA_HOME/include-I$JAVA_HOME/include/linux-olibmynio.so mynio.c-ldl,可以将原始库与您的LD_预加载库链接起来,但是我想重新编译文件src/solaris/native/sun/nio/ch/FileDispatcherImpl.c,而不是从头开始编写自己的实现。所以我想复制FileDispatcher.c中的所有内容,更改一些小东西,重新编译并重写。@LatencyFighter然后您将不得不构建整个OpenJDK。我只想重新编译该特定方法的代码,以便从write向控制台打印Hello!方法执行其已执行的操作之前的消息。我可以使用LD_预加载。我想挑战在于如何编译?、使用什么命令行、它需要什么依赖关系等等@LatencyFighter如果您只想预先完成一些操作,就不需要复制原始源文件。通过调用dlsymRTLD_NEXT,…gcc-shared-fPIC-I$JAVA_HOME/include-I$JAVA_HOME/include/linux-olibmynio.so mynio.c-ldl,可以将原始库与预加载的库链接起来