我正在嘗試將自定義本機方法(免費)添加到 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) 的外部“看到”它。
添加回答
舉報
0/150
提交
取消