我有一個Java GUI和一個C程序。 C程序計算給定值(參數)。我想在Java中調用C計算器,並將標籤更改爲GUI中的返回值(標籤幾乎每秒都會更改)。Java和C之間傳遞值
我想一些辦法,
Socket編程(可能在同一臺計算機上效率不高)
文件操作(Java寫的輸入,C基於那麼Java讀取計算值)
JNICALL的東西,但我不知道如何從c文件中獲得價值。
的共享內存(我不知道窗口SHM想法)
什麼是解決這個問題的最好方法是什麼?
我有一個Java GUI和一個C程序。 C程序計算給定值(參數)。我想在Java中調用C計算器,並將標籤更改爲GUI中的返回值(標籤幾乎每秒都會更改)。Java和C之間傳遞值
我想一些辦法,
Socket編程(可能在同一臺計算機上效率不高)
文件操作(Java寫的輸入,C基於那麼Java讀取計算值)
JNICALL的東西,但我不知道如何從c文件中獲得價值。
的共享內存(我不知道窗口SHM想法)
什麼是解決這個問題的最好方法是什麼?
如果你的C程序是一個帶有export functions的DLL,你可以看看JNA。
請記住,從過去的項目,它很好地工作,而不必自己做JNI位。
我不得不在我的工作上做類似的事情,我用C++編寫了一個幫助程序來訪問一些定製的數據庫,而我的主應用程序是用Java編寫的。數據庫API僅適用於C++程序。
我所做的是從Java啓動C++進程,並通過命令行參數和stdout進行通信。
List<String> cmdPathAndArgs = Arrays.asList("/path/to/binary", "--arg1", "--arg2");
ProcessBuilder pb = new ProcessBuilder(cmdPathAndArgs);
Processpp = pb.start();
InputStream stream = pp.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
InputStream errorStream = pp.getErrorStream();
BufferedReader errorBr = new BufferedReader(new InputStreamReader(errorStream));
如果您的程序在stdout和stderr中都生成輸出,則可能會陷入死鎖。您應該定期清空這兩個流。
如果您可以將您的C代碼構建到共享庫中,那麼JNI可能是您最好的選擇。套接字將足夠快速地處理每秒1次更新。使用文件可能會比套接字慢。共享內存也不錯,但我認爲套接字可能是一個更簡單的接口,用於你想要做的事情。
問題太廣泛了。你最好嘗試一下你提出的解決方案,然後再回答關於實際代碼的問題。一個好辦法(我忘記在java中如何完成它)是爲C程序創建進程,並重定向stdout來捕獲它的輸出。 –
爲什麼你有兩個不同的程序有什麼特別的動機? – vz0
@DrewMcGowen你寫的是JNICALL的東西。 – Duke