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

 2023-01-20    300  

问题描述

我正在尝试向OpenJDK源添加自定义的本机方法(免费),因此我可以将该方法称为System.Free()从用户应用程序内部.

我将在线资源转介并进行了以下更改:

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

{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()的驱动程序程序,并在执行后打印 .

我想在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/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).

以上所述是小编给大家介绍的将本机方法添加到OpenJDK源代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26096.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。