我目前正在寻找 JVM 的底层,具体来说是 OpenJDK JVM。我想知道 JVM 是如何调用 native 函数的。我知道它会动态加载它们并将它们保存为 void*
但我似乎找不到实际的调用部分。
例如:
jint Java_Test_add(jobject*, jint);
可以是原生的 c 函数,但也可以:
jvoid Java_Test_main(jobject*);
所以现在我想知道 JVM 如何在运行时仅将方法签名作为字符串来调用这些函数。据我所知,C 不支持这种动态调用。我希望有人能告诉我这是如何工作的或者如何解决这样的问题。
提前致谢!
最佳答案
C does not support such dynamic calls
其实是这样的。 Dynamic libraries被称为动态,因为它们可以在运行时加载,并且它们的代码可以通过符号名称链接。
DLL(或 Unix 术语中的共享库)通常包含一个符号表,用于将符号名称映射到函数的地址。操作系统提供 API 来通过名称解析地址,例如dlsym
在 POSIX 或 GetProcAddress
在 Windows 上。
JVM 基本上使用此 API 在本地方法的第一次调用时查找函数地址。然后它会记住解析的地址,以便以后的调用直接通过该地址完成。
将本地方法绑定(bind)到函数地址的另一种方法是调用 RegisterNatives
JNI 函数。调用者提供指向 native 函数的直接指针,不一定根据标准 JNI 命名约定命名。
这就是 native 方法链接 的工作原理。 调用本地方法的过程描述here .
关于java - JVM动态函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592019/