我所说的 native 是指用 C++ 或 C 编写的
我正在创建一种基于 Java 的编程语言,因为它有一个 VM 和一种字节码编译器语言。
实现语言的功能,例如 for
循环、变量、算术等等,对我来说不是问题;但是,像 Java 一样执行 native 函数是可以的。
我需要 native 函数,以便使用我的语言编写的程序能够创建窗口、与硬件和操作系统交互,以及执行任何不简单的数学操作。
我听说过 JNI ,这似乎确实是我想要的东西,但是,我不确定如何实现这样的东西。
由于我的虚拟机是用 C++ 实现的,我知道我可以拥有它 #include
在编译时我的 native 函数的 hpp 文件,然后它可以动态加载 dll
或so
然而,这看起来并不是一个好的解决方案,因为每次您希望虚拟机能够执行另一个 native 函数时,您都必须重新编译虚拟机。
问题归结为:C++ 程序(VM)如何动态地(更准确地说,在运行时,按照字节码的指示)加载具有 C++ 函数的库,然后在不预先声明的情况下执行这些函数在某个头文件中?
最佳答案
看看libffi 。它提供了在给定函数地址和调用签名的情况下调用任何函数的方法。
如何确定该签名应该是什么取决于您的上下文。您可以根据参数类型推断出各种调用。 JNA从显式 Java 接口(interface)、方法声明或动态调用参数推断 native 调用签名。
超越简单的函数调用来处理构造函数、内存管理和对象方法分派(dispatch)更为复杂,但仍然基于相同的基本原则。
关于java - 如何从虚拟机调用 native 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671882/