3 回答

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

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