将本地方法添加到 OpenJDK 源代码
Adding a native method to OpenJDK source code
我正在尝试将自定义本机方法(免费)添加到 OpenJDK 源代码,因此我可以从用户应用程序内部将该方法调用为 System.free()。
我参考了在线资源并做了以下更改:
{JDK13ROOT}/src/java.base/share/classes/java/lang/Runtime.java
public static native void free();
{JDK13ROOT}/src/java.base/share/classes/java/lang/System.java
public static void free() {
Runtime.getRuntime().free();
}
{JDK13ROOT}/src/java.base/share/native/libjava/Runtime.c
JNIEXPORT void JNICALL
Java_java_lang_Runtime_free(){
printf("Caught !\n");
}
经过以上修改后,直接调用System.free()的Driver程序编译成功,执行后打印Caught !
我想在 Java_java_lang_Runtime_free() 中调用 JVM_Free(),如下所示:
JNIEXPORT void JNICALL
Java_java_lang_Runtime_free(){
printf("Caught !\n");
JVM_Free();
}
我已将声明包含在
{JDK13ROOT}/src/hotspot/share/include/jvm.h
JNIEXPORT void JNICALL
JVM_Free(void);
和{JDK13ROOT}/src/hotspot/share/prims/jvm.cpp
中的定义相同
JVM_ENTRY_NO_ENV(void, JVM_Free(void))
JVMWrapper("JVM_Free");
printf("SUCCESS\n");
JVM_END
我参考了 GC() 的实现并进行了相同的更改。但是当我构建程序时出现以下错误。
Updating support/modules_libs/java.base/libjava.so due to 1 file(s)
/usr/bin/ld: {JDK13ROOT}/build/linux-x86_64-server-slowdebug/support/native/java.base/libjava/Runtime.o: in function `Java_java_lang_Runtime_free':
{JDK13ROOT}src/java.base/share/native/libjava/Runtime.c:71: undefined reference to `JVM_Free'
我不明白为什么我无法调用 Runtime.c 中的任何函数。
PS:我还尝试从 System.c 而不是 Runtime.c 添加本机方法,但我看到同样的构建失败。我在这里遗漏了什么或做错了什么?
您的符号 (JVM_Free
) 未导出。看这里 (t vs. T)
> nm libjvm.dylib | grep JVM_GC
000000000041508c T _JVM_GC
vs.
> nm libjvm.dylib | grep JVM_Free
000000000041517a t _JVM_Free
为了导出您的新符号,您必须在此处添加它
{JDK13ROOT}/make/hotspot/symbols/symbols-unix
一旦它出现,您就可以从 libjvm.dylib
(或 .so
)外部 "see" 它。
我正在尝试将自定义本机方法(免费)添加到 OpenJDK 源代码,因此我可以从用户应用程序内部将该方法调用为 System.free()。
我参考了在线资源并做了以下更改:
{JDK13ROOT}/src/java.base/share/classes/java/lang/Runtime.java
public static native void free();
{JDK13ROOT}/src/java.base/share/classes/java/lang/System.java
public static void free() {
Runtime.getRuntime().free();
}
{JDK13ROOT}/src/java.base/share/native/libjava/Runtime.c
JNIEXPORT void JNICALL
Java_java_lang_Runtime_free(){
printf("Caught !\n");
}
经过以上修改后,直接调用System.free()的Driver程序编译成功,执行后打印Caught !
我想在 Java_java_lang_Runtime_free() 中调用 JVM_Free(),如下所示:
JNIEXPORT void JNICALL
Java_java_lang_Runtime_free(){
printf("Caught !\n");
JVM_Free();
}
我已将声明包含在 {JDK13ROOT}/src/hotspot/share/include/jvm.h
JNIEXPORT void JNICALL
JVM_Free(void);
和{JDK13ROOT}/src/hotspot/share/prims/jvm.cpp
中的定义相同JVM_ENTRY_NO_ENV(void, JVM_Free(void))
JVMWrapper("JVM_Free");
printf("SUCCESS\n");
JVM_END
我参考了 GC() 的实现并进行了相同的更改。但是当我构建程序时出现以下错误。
Updating support/modules_libs/java.base/libjava.so due to 1 file(s)
/usr/bin/ld: {JDK13ROOT}/build/linux-x86_64-server-slowdebug/support/native/java.base/libjava/Runtime.o: in function `Java_java_lang_Runtime_free':
{JDK13ROOT}src/java.base/share/native/libjava/Runtime.c:71: undefined reference to `JVM_Free'
我不明白为什么我无法调用 Runtime.c 中的任何函数。
PS:我还尝试从 System.c 而不是 Runtime.c 添加本机方法,但我看到同样的构建失败。我在这里遗漏了什么或做错了什么?
您的符号 (JVM_Free
) 未导出。看这里 (t vs. T)
> nm libjvm.dylib | grep JVM_GC
000000000041508c T _JVM_GC
vs.
> nm libjvm.dylib | grep JVM_Free
000000000041517a t _JVM_Free
为了导出您的新符号,您必须在此处添加它
{JDK13ROOT}/make/hotspot/symbols/symbols-unix
一旦它出现,您就可以从 libjvm.dylib
(或 .so
)外部 "see" 它。