为了账号安全,请及时绑定邮箱和手机立即绑定

将本机方法添加到 OpenJDK 源代码

将本机方法添加到 OpenJDK 源代码

缥缈止盈 2023-06-28 16:14:34
我正在尝试将自定义本机方法(免费)添加到 OpenJDK 源中,因此我可以从用户应用程序内部将该方法调用为 System.free() 。我参考了在线资源来这样做,并做了以下更改:{JDK13ROOT}/src/java.base/share/classes/java/lang/Runtime.javapublic static native void free();{JDK13ROOT}/src/java.base/share/classes/java/lang/System.javapublic static void free() {        Runtime.getRuntime().free();}{JDK13ROOT}/src/java.base/share/native/libjava/Runtime.cJNIEXPORT void JNICALLJava_java_lang_Runtime_free(){     printf("Caught !\n");}经过上述更改后,我能够成功编译直接调用 System.free() 的驱动程序,并打印Caught ! 执行后。我想在 Java_java_lang_Runtime_free() 中调用 JVM_Free() ,如下所示:JNIEXPORT void JNICALLJava_java_lang_Runtime_free(){     printf("Caught !\n");     JVM_Free();}我已将声明包含在 {JDK13ROOT}/src/hotspot/share/include/jvm.h中JNIEXPORT void JNICALLJVM_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 中的本机方法,并且我看到相同的构建失败。我在这里错过了什么或做错了什么?
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信