我正在尝试向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()并在执行后打印“Caught!”的Driver程序。
我想在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中的本地方法添加到代码中,但是我看到了相同的构建失败。我错过了什么或者在这里做错了什么?