2014-07-23 102 views
0

我有一個Java GUI和一個C程序。 C程序計算給定值(參數)。我想在Java中調用C計算器,並將標籤更改爲GUI中的返回值(標籤幾乎每秒都會更改)。Java和C之間傳遞值

我想一些辦法,

  1. Socket編程(可能在同一臺計算機上效率不高)

  2. 文件操作(Java寫的輸入,C基於那麼Java讀取計算值)

  3. JNICALL的東西,但我不知道如何從c文件中獲得價值。

  4. 的共享內存(我不知道窗口SHM想法)

什麼是解決這個問題的最好方法是什麼?

+2

問題太廣泛了。你最好嘗試一下你提出的解決方案,然後再回答關於實際代碼的問題。一個好辦法(我忘記在java中如何完成它)是爲C程序創建進程,並重定向stdout來捕獲它的輸出。 –

+0

爲什麼你有兩個不同的程序有什麼特別的動機? – vz0

+0

@DrewMcGowen你寫的是JNICALL的東西。 – Duke

回答

1

如果你的C程序是一個帶有export functions的DLL,你可以看看JNA

請記住,從過去的項目,它很好地工作,而不必自己做JNI位。

0

我不得不在我的工作上做類似的事情,我用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中都生成輸出,則可能會陷入死鎖。您應該定期清空這兩個流。

0

如果您可以將您的C代碼構建到共享庫中,那麼JNI可能是您最好的選擇。套接字將足夠快速地處理每秒1次更新。使用文件可能會比套接字慢。共享內存也不錯,但我認爲套接字可能是一個更簡單的接口,用於你想要做的事情。