如何从Java调用C++功能

7
我有一个Java程序,主要是GUI并显示从C++命令行工具写入到XML文件中的数据。现在我想在Java程序中添加一个按钮来刷新数据。这意味着我的程序必须调用C++功能。
最好的方法是通过系统调用从Java调用程序吗? C++程序将编译为Mac OS和Windows,并且应始终位于与Java程序相同的目录中。
我想生成一个可执行文件,C程序可以存储在JAR中并从我的程序中调用吗?
4个回答

6
如果您可以访问代码并希望与外部程序进行“交互式”体验(例如,进行调用、获取结果、进行其他调用),请研究JNI。它允许您通过将JNI juice包含和链接到C或C++应用程序来从Java应用程序中调用C或C++代码。
参见:

http://en.wikipedia.org/wiki/Java_Native_Interface

http://www.acm.org/crossroads/xrds4-2/jni.html

如果你只需要一个“启动应用程序并获取结果”的解决方案,请查看Runtime.exec(),它允许你启动外部程序并捕获其输出。

See: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

http://www.rgagnon.com/javadetails/java-0014.html


5
假设没有更好的通信方法可用(SOAP、ICE、Sockets等),我会使用Runtime.exec()调用可执行文件。 JNI可以用于直接接口,但我不建议使用。不,你不能把一个可执行文件放在jar包中。虽然你可以这样做,但你不能运行它,因为shell不知道如何运行它。

1
JNI有什么问题吗?它存在是有原因的,而且从性能上来说肯定比启动一个单独的进程要好得多。 - Pavel Minaev
JNI的问题在于,如果出现错误,您的JVM可能会崩溃。就像“segfault:code dumped”一样。 - Stephen C
2
@Pavel: 更不便携,更不稳定,耦合更紧密。 - Draemon

3

2

回答您的最后一个问题,您无法从您的jar文件中运行可执行文件。

但是,您可以将其存储在您的jar文件中,并在运行它之前将其提取到临时目录/文件中(第一次检查其存在性并在必要时提取)。这将在某种程度上简化您的分发,因为您只需要分发jar文件,并确保您运行的可执行文件与您的jar文件中的Java代码匹配。


我曾经做过类似的事情。效果很好,但如果你的程序需要在不同的平台上运行,我不确定它是否会很困难。 - sixtyfootersdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接