3 回答

TA貢獻1775條經驗 獲得超8個贊
你說的是不同的機器上的?可以考慮消息隊列比如ZeroMQ或者RabbitMQ。如果Java是作為服務端,也可以做WebService,C/C++使用gSoap進行調用。序列化隨意可以是ProtoBuf之類的需要定義的,也可以用JSON或XML。

TA貢獻1880條經驗 獲得超4個贊
如果是單機的話, 確實可以使用 JNI.
不過如果是各個模塊之間在不同的主機上的話, 那么就需要進行網絡通信了.
下面我針對網絡通信的方式來講一下我的做法:
針對于同步調用模式
如果 Java 和 C++ 之間是相互調用關系的話, 例如 Java 調用 C++ 提供的服務, 那么一般可以看做是同步調用關系, 此時有如下幾個方法:
C++ 和 Java 之間使用 TCP 直接通信.
這個方法最直接也相對地不是很方便, 畢竟 Java 和 C++ 直接需要定義 TCP 通信協議, 無形中增加了負擔, 如果不是必要的話, 最好不要使用這樣的方法吧.基于 HTTP 的 API 接口.
這個方法比直接使用 TCP 方式好很多. Java 可以使用 SpringMVC 或者 Netty 之類的框架或庫提供 HTTP RESTful 接口, C++ 可以通過 HTTP 請求調用這些 api, 而且相對于直接寫 TCP 交互來說, 編寫調試過程都相對簡單一些.基于 Thrift 的 RPC 調用.
我推薦這個方法. 首先 Java 和 C++ 都有現成的 Thrift 庫, 直接可以使用; 第二, 使用 Thrift 的話, 就不需要關系交互協議的問題了, Thrift 已經封裝好了, 你直接寫好各個服務調用接口即可; 第三, Thrift 實現了序列化功能, Java 和 C++ 之間可以直接交互結構化的數據, 不需要再次解析了; 而且使用了 Thrift 后, 還可以方便地將服務提供給更多的語言模塊使用, 例如 Python, PHP 等.
針對異步交互模式
如果各個模塊之間的交互不需要同步的話, 那么可以考慮使用隊列的方式.
我原來做過一個項目, 也有類似的需求, 不過我的各個模塊之間不需要強的同步性, 因此我選擇了 ActiveMQ 和 Protobuf 的組合.
Protobuf 的作用是提供 Java 和 C++ 之間的數據對象的序列化, 方便它們之間的數據交互, 而 ActiveMQ 就是一個 Java 編寫的著名的開源消息隊列實現.
整個方案也不復雜, 即 Java 通過 Protobuf 將結構化的數據 序列化為二進制數據, 然后放到 ActiveMQ 消息隊列中. C++ 模塊呢, 就監聽 ActiveMQ 隊列中的消息, 當獲取到一個消息時, 就使用 Protobuf 反序列化出來, 進而獲取到 C++ 可以處理的數據.
添加回答
舉報