【发布时间】:2018-12-17 13:07:35
【问题描述】:
我正在做一个 C/C++ 项目。
我在网上发现了一些非常有价值的 Java 库形式的资产,我想将它们集成到我的 C/C++ 项目中。这些是我不会考虑移植到 C/C++ 的大型项目。
我在Stackoverflow 的帖子中读到,Java 代码可以编译为本机代码,因此无需中间有 Java 虚拟机就可以运行 Java 项目。我还发现,甚至还有一个名为 ExcelsiorJET 的商业工具可以做到这一点,这让我更加相信这可能是一个可靠的东西。
考虑到 1、2 和 3,我想知道是否可以采用 Java 库,将其编译为本机库,然后在该库之上创建 C 或 C++ 包装器。这意味着这种方式不再需要 Java 虚拟机。这样,我将摆脱 Java 虚拟机层。这可能吗?
我在网上搜索是否有人成功创建过这种管道,但无法得出结论......
我想问的是,这条管道是否可行,至少在理论上,如果没有成功创建它的在线示例。
如果可能的话,谁能指出我正确的方向?
【问题讨论】:
-
如果这些库在 API 中强制使用许多类,那么即使在 C/C++ 和 Java 之间重新打包也是一个负担(即使自动完成)。理想情况下,这两种语言应该分开,并且可能需要在 java 中进行一些开发。是用一只手绑在背后的展开。可行,但混合成本很高。
-
您尝试过 JIT。它通过在运行时将字节码编译为本机机器码来工作。这是一个堆栈溢出答案,提供了有关此工具的详细信息。 stackoverflow.com/a/95679/7548672
-
网络上有很多关于从 Java 调用本机代码的材料(参见 JNA 和 JNI),而不是其他方向。您可能会更成功地将您的应用程序构建为一个 Java“驱动程序”,它协调对您的 C 代码和您要使用的第 3 方 Java 的调用。
-
这里有一个关于通过 JNI (sweetcode.io/calling-java-code-from-cc-transparently) 从 C++ 调用 Java 的有趣描述,这将消除对 Java“驱动程序”的需要。 (它仍然有一个正在运行的 JVM)。
-
@dan.mwasuser2321368 感谢您的回答!如果我错了,请纠正我,但使用 JNI 从 C++ 调用 Java 意味着让 Java 代码在虚拟机上运行。我想要的是摆脱虚拟机层,并在从 Java 代码获得的本机库之上有一个 C 或 C++ 包装器。