我有一個Java應用程序,我需要將一些信息傳遞給C++程序。有人建議我使用一些簡單的套接字編程來做到這一點。這是最好的方法嗎?如果不是什麼選擇?如果是這樣,我應該如何去學習socket編程?將信息從java傳遞給C++的最佳方式是什麼?
回答
您有幾種選擇:
- 傳遞從Java文件到C++。這可能是最簡單的。這很容易測試,並且不應該在任何一端都需要任何第三方庫。
- 使用上述插座。在C++中,如果您需要跨平臺解決方案,像ACE或boost這樣的庫將爲您節省一些心疼
- 使用JNI可以從Java調用到C++,反之亦然。這可能是最困難但最高效的。
對於學習套接字,谷歌搜索"java socket tutorial"或"c++ socket tutorial"會給你很多的信息。
您可以使用Java Native Interface(JNI)。 JNI允許您從Java應用程序調用C庫。請注意,JNI調用是C而不是C++調用,因此您必須在C++函數(extern「C」)上指定C調用約定。
JNI有一個很難做的聲譽。這並不容易,但它確實可行。我會建議不要使用套接字。使用套接字聽起來就像討巧但對我來說,無異於打開討厭一罐蠕蟲...
需要更多信息(但一個很好的問題)。
這兩個獨立的程序是否在同一時間運行?
如果不是,和Java程序需要調用一個C++庫,JNI的答案是一個很好的解決方案,但它不會真正跨進程的工作。
在進程的情況下,你真的需要找到一種方法跨越進程進行通信......一個簡單的解決方案(可能不是最好的,但我不知道您的具體情況),將有一個二進制文件寫入和讀取...只是不要忘記提防競爭條件!套接字也可以工作,但是如果你的程序進行了很多通信,那麼CPU功耗可能會有點大。
一個簡單的方法來做到這一點是使用標準的輸入和輸出:
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
戴夫提到的選項是一些最常用的方法。
作爲擴展到JNI的解決方案,你也可以看看直接字節緩衝區(Java 1.4中和以後),如果你有你想要的Java和C之間共享一些原始數據++。直接字節緩衝區允許您在C++或Java端分配一定大小的緩衝區,然後輕鬆地從兩種語言訪問緩衝區;在Java中,這是通過ByteBuffer對象上的方法完成的,並且在C++中可以獲得指向數據的指針。如果您有足夠的信息進行交換,並且您不希望將它們全部作爲JNI方法中的參數傳遞,則ByteBuffers非常方便。
套接字的方法是可能矯枉過正,但我不確定你在做什麼。
而且,如果這不是在噪聲丟失,使用SWIG來幫你,如果你嘗試JNI路線。 http://www.swig.org/
還有SOAP的選項,但這可能是矯枉過正,假設您在同一臺機器上只有兩個進程。爲了完整性,我仍然提到它。
雖然答案已被接受,這裏的關鍵問題是兩種語言之間的語義不匹配:假設你有某種流連接的事情,你是如何有效地交換數據?
一個解決方案我可能會建議是谷歌協議緩衝器。它不能解決子/ JNI /插座的問題,但它所做的就是讓你一個非常有效的方式有通過流協議的複雜對象結構中轉。
記住:JNI是複雜的,特別是對複雜對象的引用,但它是有效的。最重要的是通過適當的高效上下文切換傳遞數據。 GPB + JNI /子流程套接字允許單個上下文切換來拉取數據,並結合雙方高效的編解碼器支持。
- 1. 將值從html頁面傳遞給java類的最佳方式是什麼?
- 2. 將值傳遞給模態的最佳方式是什麼?
- 3. 將JS/css信息傳遞給表單的最佳方法
- 4. 將字符串從C傳遞給Ada的最佳方式
- 5. 什麼是將特定參數傳遞給方法的最佳方式
- 6. 在Symfony中將變量傳遞給layout.php的最佳方式是什麼?
- 7. 將值傳遞給不同視圖的最佳方式是什麼?
- 8. 將回調函數傳遞給std :: map的最佳方式是什麼?
- 9. 將多個查詢參數傳遞給restful api的最佳方式是什麼?
- 10. 什麼是最好的方法將信息從一個孩子傳遞給C#中的父對象#
- 11. 在快捷方式將信息傳遞給一個C#的.exe
- 12. 將C#變量傳遞給JS的最佳方式
- 13. 什麼是推遲信息的最佳方式?
- 14. 什麼是在Android中顯示信息的最佳方式
- 15. 在多列中展示信息的最佳方式是什麼?
- 16. 什麼是將數組從jade傳遞到節點js的最佳方式
- 17. 將信息顯示到ListFragment的最佳方法是什麼?
- 18. 處理傳入短信的最佳方式是什麼?
- 19. Adobe flex與Java通信的最佳方式是什麼?
- 20. 通過segue傳遞子類的最佳方式是什麼?
- 21. 將對象傳遞給NodeJS中的子文件的最佳方法是什麼?
- 22. 將信息傳遞給jqModal
- 23. 將結構嚴密的信息傳遞給WCF方法。最佳實踐
- 24. 將瓶子變量直接傳遞給vue的最佳方法是什麼?
- 25. 在asp.net中將流pdf傳遞給HttpHandler的最佳方法是什麼?
- 26. 將變量傳遞給Woocommerce產品的最佳方法是什麼?
- 27. 使用Java傳輸文件的最佳方式是什麼?
- 28. 將變量值從服務器傳遞給JavaScript的最佳做法是什麼?
- 29. 在Winforms C#中的GUI之間傳遞變量的最佳方式是什麼?
- 30. 將您介紹給項目的最佳方式是什麼?
我聽說過痛飲,但我從來沒有使用它。比JNI更容易嗎?有誰知道? – OscarRyz 2009-01-20 22:03:02