Java JVM动态函数调用
我目前正在寻找JVM的引擎盖下,OpenJDK JVM的引擎盖是特定的。我想知道JVM是如何调用本机函数的。我知道它动态加载它们并将它们保存为Java JVM动态函数调用,java,c,dynamic,jvm,java-native-interface,Java,C,Dynamic,Jvm,Java Native Interface,我目前正在寻找JVM的引擎盖下,OpenJDK JVM的引擎盖是特定的。我想知道JVM是如何调用本机函数的。我知道它动态加载它们并将它们保存为void*,但我似乎找不到实际的调用部分 例如: jint Java_Test_add(jobject*, jint); 可以是本机c函数,但也可以是: jvoid Java_Test_main(jobject*); 所以现在我想知道JVM如何在运行时将方法签名作为字符串调用这些函数。据我所知,C不支持这种动态调用。我希望有人能告诉我这是如何工作的,或
void*
,但我似乎找不到实际的调用部分
例如:
jint Java_Test_add(jobject*, jint);
可以是本机c函数,但也可以是:
jvoid Java_Test_main(jobject*);
所以现在我想知道JVM如何在运行时将方法签名作为字符串调用这些函数。据我所知,C不支持这种动态调用。我希望有人能告诉我这是如何工作的,或者如何解决这样的问题
提前谢谢 您可以通过以下两种基本方法之一解决此问题:
这就是本机方法链接的工作原理。描述了调用本机方法的过程。每种语言都有自己的过程调用约定(如何执行对子例程的调用,应该将什么放入堆栈或寄存器中,必须执行什么才能从子例程返回),以及在这种情况下,从Java调用用C编写的本机方法会发生什么,jvm需要模仿C调用约定,在其正常上下文之外执行您编写的方法
Java\u Test\u add
方法签名将用于获取对内存中C函数位置的引用(从编译项目时链接的静态库加载),invoke_本机指令实现(每个jvm实现不同)将负责执行调用并处理返回(这可以手动完成,但正如有人所说,有libffi这样的库实现了各种调用约定)
因此,您不必从C语言特性的角度来看待这一点,因为是的,该语言没有提供一些简单的语法糖来在运行时执行这种“动态”调用,但这仍然可以实现,最终会在混合中添加一些汇编