我有一个主要是GUI的Java程序,它显示了从c ++命令行工具写入xml文件的数据。现在我想在java程序中添加一个按钮来刷新数据。这意味着我的程序必须调用c ++功能。
是通过系统调用从java调用程序的最佳方法吗? c ++程序将为mac os和windows编译,并且应始终与java程序位于同一目录中。
我想生成一个可执行文件,可以将c程序存储在jar中并从我的程序中调用吗?
答案 0 :(得分:6)
如果您可以访问代码并希望获得外部程序的“交互式”体验(例如,调用,获取结果,进行其他调用),请研究JNI,它允许您从Java调用C或C ++代码申请包括&使用。
将JNI果汁链接到您的C或C ++应用程序请参阅:
http://en.wikipedia.org/wiki/Java_Native_Interface
http://www.acm.org/crossroads/xrds4-2/jni.html
如果你真的需要一个“启动应用并获得结果”的解决方案,请查看Runtime.exec(),它可以让你启动一个外部程序&捕获其输出。
请参阅: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
答案 1 :(得分:5)
假设没有更好的通信方法(SOAP,ICE,套接字等),我会使用Runtime.exec()
调用可执行文件。 JNI可以直接用于界面,但我不推荐它。不,你不能把一个可执行文件放在jar中。嗯,你可以,但你不能运行它,因为shell不知道如何运行它。
答案 2 :(得分:3)
您可能还想查看Java Native Access API (JNA)。
答案 3 :(得分:2)
要回答您的最后一个问题,您无法在jar中运行可执行文件。
但是,你可以将它存储在你的jar中并在运行之前将其提取到临时目录/文件中(第一次检查它的存在并在必要时提取)。这将简化您的分发,因为您只需要分发jar,并确保您运行的是与您的jar代码相匹配的可执行文件。