java - JVM动态函数调用

标签 java c dynamic jvm java-native-interface

我目前正在寻找 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/

相关文章:

java - Jconsole可以用来监控IBM JDK吗?

java - 字符串数据,右截断 - Hibernate with Spring Boot

java - 通过 bundle 传递数组列表

c - 浮点异常: 8

javascript - 如何在浏览器的调试器本身中调试动态加载的 JavaScript(使用 jQuery)?

c# - 转换为 IEnumerable<动态>?

java - 如何在 ListView 中实现删除按钮并从数据库中删除?

c - 当我在 printf() 中的字符串后添加一个带加号的 int 时会发生什么

c - 为什么我的 C 编译器会发出警告?

c - 使用指针和 realloc 添加新记录