我有一個主要是GUI的Java程序,它顯示了從C++命令行工具寫入xml文件的數據。現在我想添加一個按鈕到java程序來刷新數據。這意味着我的程序必須調用C++的功能。如何從java調用C++功能
是通過系統調用從java調用程序的最佳方式嗎? C++程序將爲mac os和windows編譯,並且應該始終與java程序位於同一目錄中。
我想生成一個可執行文件,可以將c程序存儲在jar文件中並從我的程序中調用?
我有一個主要是GUI的Java程序,它顯示了從C++命令行工具寫入xml文件的數據。現在我想添加一個按鈕到java程序來刷新數據。這意味着我的程序必須調用C++的功能。如何從java調用C++功能
是通過系統調用從java調用程序的最佳方式嗎? C++程序將爲mac os和windows編譯,並且應該始終與java程序位於同一目錄中。
我想生成一個可執行文件,可以將c程序存儲在jar文件中並從我的程序中調用?
假設沒有更好的通信方法是可用的(SOAP,ICE,插座等),我稱之爲使用Runtime.exec()
可執行文件。 JNI可以用來直接連接,但我不會推薦它。不,你不能把一個可執行文件放在jar中。你可以,但是你不能運行它,因爲shell不知道如何運行它。
如果你有機會獲得代碼,並要與外部程序的「互動」的經驗(如撥打電話,得到的結果,使更多的調用),調查JNI,它允許您從調用C或C++代碼Java應用程序通過包含&將JNI juice連接到您的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
你可能也想看看Java Native Access API (JNA)。
要回答你的最終問題,你不能在你的jar中運行一個可執行文件。
但是,您可以它你的店JAR中並將其解壓到之前運行它的臨時目錄/文件(檢查是否有其存在的第一時間,必要時提取)。這將簡化您的分發,因爲您只需分發jar,並確保您運行的是與您的jar代碼相匹配的可執行文件。
JNI有什麼問題?這是有原因的,而且它明顯比開始一個單獨的過程更好的性能。 – 2009-07-31 05:06:53
JNI的問題是如果你犯了一個錯誤,你的JVM很容易崩潰。如在「段錯誤:代碼轉儲」中。 – 2009-07-31 07:56:40