【问题标题】:Linking Java with C++ statically using JNI使用 JNI 将 Java 与 C++ 静态链接
【发布时间】:2012-06-15 18:18:43
【问题描述】:

是否可以将 C++ 库静态链接到 Java 程序,就像链接 2 个 C++ 库一样,将它们变成一个文件?
(我读到java程序也可以编译成EXE)。

【问题讨论】:

  • 在正常情况下我不得不说不。微软使用肮脏的黑客来制作包含托管非托管代码的“混合程序集”,并且可能存在一个 java->exe 工具可以做到这一点。不过,我很好奇为什么 DLL 不适合。
  • 天哪。我建议您真正想做的是将您的应用程序作为可通过 Internet 访问的服务运行。如果做不到这一点,您可能应该节省一点,并与 Excelsior JET 人员聊天,他们似乎是最有可能支持此类功能的人。
  • @Rook - 混合模式程序集并不完全是肮脏的黑客。他们有很好的记录/正常。

标签: java c++ java-native-interface


【解决方案1】:

理论上,这应该可以创建一个已经包含 JVM 使用的所需 JNI 函数的 EXE。

此 EXE 必须通过在同一进程中启动 JVM 实例来加载 Java 部分(通过加载 jvm.dll 并执行它,如问题 JNI Java in c++ 所示)。

我知道的 Java-EXE 包装器不支持这样的东西,因为它们带有一个预编译的 EXE,它将使用的 JAR 作为资源附加。因此,我假设您必须构建自己的 C/C++ 可执行文件并实现所需的所有功能。

【讨论】:

  • 没有。加载 jvm.dll 不符合“就像链接 2 个 C++ 库一样”。
  • @EJP 当然,JVM 永远不能编译成 EXE,但是应该一起使用的库可以链接到生成的可执行文件中。然后,您将拥有一个 EXE 文件,其中包含除 JRE 之外的所有内容。
  • 他特意要了一个文件。这至少是两个文件。
  • 最初的问题只是询问是否可以集成 C++ 库。 JVM 不是这个问题范围之外的 C++ 库。因此我的回答是正确的。你想得太远了。
  • @EJP:当我编写“单个文件”时,我的意思是我希望将我的 C++ 库集成到 Java EXE 中。将 JVM 作为单独的 DLL 非常好 :)
【解决方案2】:

当我使用 JNI 时,我将支持 JNI 的 dll 包含到我的 jar 文件中。然后通过类路径访问它。您将拥有单个 jar 文件。

【讨论】:

  • 真的吗?操作系统如何在 JAR 文件中加载 DLL?这“就像链接 2 个 C++ 库一样”如何?
【解决方案3】:

除非您有权访问 jvm.lib 库的静态版本,否则这是不可能的。它作为引用 jvm.dll 的动态链接库分发。你不能这样做。

【讨论】:

  • @downvoter 请用这个答案解释你认为的问题。不明原因的反对票对任何人都没有帮助并引起其他怀疑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多