向OpenJDK源代码添加本地方法

4

我正在尝试向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中的本地方法添加到代码中,但是我看到了相同的构建失败。我错过了什么或者在这里做错了什么?


JOOI,为什么不将它作为JNI共享库与应用程序一起打包,而是硬塞到JRE本身中呢? - Alnitak
@Alnitak 谢谢您的回复。您可以告诉我如何做或提供一些参考链接吗? - srccode
1个回答

3
您的符号(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)的外部“看到”它。


Oo.oO 感谢您的回答。我在 {JDK13ROOT}/build/linux-x86_64-server-slowdebug/hotspot/variant-server/libjvm/gtest/ 中找到了 libjvm.so。它起作用了!非常感谢。 - srccode
.oOo. 很酷!玩得开心,使用Java和本地工具 ;) .oOo. - Oo.oO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接