2009-01-20 135 views
18

我有一個Java應用程序,我需要將一些信息傳遞給C++程序。有人建議我使用一些簡單的套接字編程來做到這一點。這是最好的方法嗎?如果不是什麼選擇?如果是這樣,我應該如何去學習socket編程?將信息從java傳遞給C++的最佳方式是什麼?

回答

16

您有幾種選擇:

  • 傳遞從Java文件到C++。這可能是最簡單的。這很容易測試,並且不應該在任何一端都需要任何第三方庫。
  • 使用上述插座。在C++中,如果您需要跨平臺解決方案,像ACEboost這樣的庫將爲您節省一些心疼
  • 使用JNI可以從Java調用到C++,反之亦然。這可能是最困難但最高效的。

對於學習套接字,谷歌搜索"java socket tutorial""c++ socket tutorial"會給你很多的信息。

1

您可以使用Java Native Interface(JNI)。 JNI允許您從Java應用程序調用C庫。請注意,JNI調用是C而不是C++調用,因此您必須在C++函數(extern「C」)上指定C調用約定。

JNI有一個很難做的聲譽。這並不容易,但它確實可行。我會建議不要使用套接字。使用套接字聽起來就像討巧但對我來說,無異於打開討厭一罐蠕蟲...

+0

我聽說過痛飲,但我從來沒有使用它。比JNI更容易嗎?有誰知道? – OscarRyz 2009-01-20 22:03:02

0

需要更多信息(但一個很好的問題)。

這兩個獨立的程序是否在同一時間運行?

如果不是,和Java程序需要調用一個C++庫,JNI的答案是一個很好的解決方案,但它不會真正跨進程的工作。

在進程的情況下,你真的需要找到一種方法跨越進程進行通信......一個簡單的解決方案(可能不是最好的,但我不知道您的具體情況),將有一個二進制文件寫入和讀取...只是不要忘記提防競爭條件!套接字也可以工作,但是如果你的程序進行了很多通信,那麼CPU功耗可能會有點大。

6

一個簡單的方法來做到這一點是使用標準的輸入和輸出:

class MyTest { 
    public static void main(String... args) { 
     System.out.println("carpet"); 
    } 
} // Java 

#include <iostream> 
#include <string> 
int main() { 
    string input; 
    std::getline(std::cin, input); 
    std::cout << "from java: " << input << std::endl; // output: carpet 
} // C++ 

# start by piping java's output to c++'s input 
$ java MyTest | ./my_receive 
1

戴夫提到的選項是一些最常用的方法。

作爲擴展到JNI的解決方案,你也可以看看直接字節緩衝區(Java 1.4中和以後),如果你有你想要的Java和C之間共享一些原始數據++。直接字節緩衝區允許您在C++或Java端分配一定大小的緩衝區,然後輕鬆地從兩種語言訪問緩衝區;在Java中,這是通過ByteBuffer對象上的方法完成的,並且在C++中可以獲得指向數據的指針。如果您有足夠的信息進行交換,並且您不希望將它們全部作爲JNI方法中的參數傳遞,則ByteBuffers非常方便。

套接字的方法是可能矯枉過正,但我​​不確定你在做什麼。

0

還有SOAP的選項,但這可能是矯枉過正,假設您在同一臺機器上只有兩個進程。爲了完整性,我仍然提到它。

4

雖然答案已被接受,這裏的關鍵問題是兩種語言之間的語義不匹配:假設你有某種流連接的事情,你是如何有效地交換數據?

一個解決方案我可能會建議是谷歌協議緩衝器。它不能解決子/ JNI /插座的問題,但它所做的就是讓你一個非常有效的方式有通過流協議的複雜對象結構中轉。

記住:JNI是複雜的,特別是對複雜對象的引用,但它是有效的。最重要的是通過適當的高效上下文切換傳遞數據。 GPB + JNI /子流程套接字允許單個上下文切換來拉取數據,並結合雙方高效的編解碼器支持。

相關問題