向 OpenJDK 源代码添加原生方法

问题描述 投票:0回答:2

我正在尝试向 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,但我看到了相同的构建失败。我在这里错过了什么或做错了什么?.

java c++ java-native-interface native-methods
2个回答
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
)的外部“看到”它。


0
投票

@srcode 我有同样的问题,你能提供更多关于你为实现 System.free() 所做的更改的信息吗?

© www.soinside.com 2019 - 2024. All rights reserved.