java - 如何从虚拟机调用 native 函数?

标签 java c++ java-native-interface shared-libraries

我所说的 native 是指用 C++ 或 C 编写的

我正在创建一种基于 Java 的编程语言,因为它有一个 VM 和一种字节码编译器语言。

实现语言的功能,例如 for循环、变量、算术等等,对我来说不是问题;但是,像 Java 一样执行 native 函数是可以的。

我需要 native 函数,以便使用我的语言编写的程序能够创建窗口、与硬件和操作系统交互,以及执行任何不简单的数学操作。

我听说过 JNI ,这似乎确实是我想要的东西,但是,我不确定如何实现这样的东西。

由于我的虚拟机是用 C++ 实现的,我知道我可以拥有它 #include在编译时我的 native 函数的 hpp 文件,然后它可以动态加载 dllso然而,这看起来并不是一个好的解决方案,因为每次您希望虚拟机能够执行另一个 native 函数时,您都必须重新编译虚拟机。

问题归结为:C++ 程序(VM)如何动态地(更准确地说,在运行时,按照字节码的指示)加载具有 C++ 函数的库,然后在不预先声明的情况下执行这些函数在某个头文件中?

最佳答案

看看libffi 。它提供了在给定函数地址和调用签名的情况下调用任何函数的方法。

如何确定该签名应该是什么取决于您的上下文。您可以根据参数类型推断出各种调用。 JNA从显式 Java 接口(interface)、方法声明或动态调用参数推断 native 调用签名。

超越简单的函数调用来处理构造函数、内存管理和对象方法分派(dispatch)更为复杂,但仍然基于相同的基本原则。

关于java - 如何从虚拟机调用 native 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671882/

相关文章:

java - 使用 MiGlayout 的开源 Swing GUI 生成器

C++类实例数组初始化

android - GetFieldID 在 Android 4.4 及更早版本上失败

android - 在 Android Studio 中使用现有的 C++ 文件

java - 将复杂的 json 文件反序列化为 POJO - 要么作为一个列表元素工作,要么不工作

Java:在实现各种树结构时我应该支持泛型吗?

java - 如何获取枚举中属性的值?

c++ - 顺序与结合性

c++ - Opencv 膨胀和骨架(c++)

java - JNI : Direct buffer reading & writing