亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java與c++模塊之間的交互方法?

java與c++模塊之間的交互方法?

侃侃無極 2018-07-21 19:17:41
現在有一個項目,用到了java和c++來實現不同的模塊,目前的問題是:如何高效方便地實現java和c++之間的通信?我想到的是使用TCP進行數據交互,不過感覺這樣還是太費勁了,有沒有更好的方法?
查看完整描述

3 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

試試JNI?

查看完整回答
反對 回復 2018-07-24
?
www說

TA貢獻1775條經驗 獲得超8個贊

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

查看完整回答
反對 回復 2018-07-24
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

如果是單機的話, 確實可以使用 JNI.
不過如果是各個模塊之間在不同的主機上的話, 那么就需要進行網絡通信了.
下面我針對網絡通信的方式來講一下我的做法:

針對于同步調用模式

如果 Java 和 C++ 之間是相互調用關系的話, 例如 Java 調用 C++ 提供的服務, 那么一般可以看做是同步調用關系, 此時有如下幾個方法:

  1. C++ 和 Java 之間使用 TCP 直接通信.
    這個方法最直接也相對地不是很方便, 畢竟 Java 和 C++ 直接需要定義 TCP 通信協議, 無形中增加了負擔, 如果不是必要的話, 最好不要使用這樣的方法吧.

  2. 基于 HTTP 的 API 接口.
    這個方法比直接使用 TCP 方式好很多. Java 可以使用 SpringMVC 或者 Netty 之類的框架或庫提供 HTTP RESTful 接口, C++ 可以通過 HTTP 請求調用這些 api, 而且相對于直接寫 TCP 交互來說, 編寫調試過程都相對簡單一些.

  3. 基于 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++ 可以處理的數據.


查看完整回答
反對 回復 2018-07-24
  • 3 回答
  • 0 關注
  • 1318 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號