【问题标题】:Compile Java project to a native library and create a C/C++ wrapper on top将 Java 项目编译为本机库并在顶部创建 C/C++ 包装器
【发布时间】:2018-12-17 13:07:35
【问题描述】:
  1. 我正在做一个 C/C++ 项目。

  2. 我在网上发现了一些非常有价值的 Java 库形式的资产,我想将它们集成到我的 C/C++ 项目中。这些是我不会考虑移植到 C/C++ 的大型项目。

  3. 我在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++ 包装器。

标签: java c++ jvm native


【解决方案1】:

看看 JNI 和 JVM 启动顺序:在这个级别都是 C/C++ 编码。

您可以提前编译 java (AOT),也可以像调用库一样调用 JVM(这就是 Launch4j 等可执行包装器的工作方式)。

简化 Java/C/C++ 接口的一种方法是使用 IDL。一旦定义了 IDL 接口,它就可以用来生成 Java/C/C++ 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多