如何从JDK(SocketChannelImpact和SocketDispatcher)更改Java本机代码(C实现)并重新编译以与JDK一起使用?
我需要从SocketDispatcher.java中找到、重新编译并在Linux上运行的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
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,可以将原始库与预加载的库链接起来