2014-09-29 19 views
1

我必須構建用於圖像處理的軟件。我用java來顯示圖像和C++的應用程序的功能。很明顯,圖像將從C++發送到Java,反之亦然。 我很困惑爲哪種方法選擇溝通C++和java。我學習和做大量的研究,終於發現3的方法:用於圖像處理應用的C++和Java通信

  1. JNI(Java本地接口)

  2. 管道

  3. 插槽。 哪種方法會更好選擇?我必須處理高達10MB的高清圖像。請幫助我們。

回答

1

如果C++應用程序可以被安裝並作爲命令行應用程序訪問(例如:FFmpeg的,MLT等),按照下列...

  1. 訪問C++應用程序使用運行時處理執行在Java中是Runtime.exec()。 這會比其他選項節省很多努力。
  2. Queue實現精簡集羣處理環境中執行(當你的業務量高)運行過程中執行的
  3. 錯誤處理/記錄

參考:Invoking via command line versus JNI

+1

但是每次調用新進程都會降低性能 – 2014-09-29 10:15:03

+0

由於命令行執行將直接引用資源(圖像),因此您在一定程度上避免了磁盤I/O約束。如果您需要關注在服務器上運行的多個並行進程,請執行步驟#2。 – 2014-09-29 11:46:20

1

我也同樣的工作問題。作爲一種專業的方式,根據我的上一次基準測試,使用JNI從java調用C++ DLL是最好的方法。 JNA是另一種方式,但速度較慢,並且對於某些功能(例如兩個側面對象映射和通過參考問題)的機會較少。 10 MB也是小數目,我用2 GB圖像試了一下,JNI成功了那個大文件沒有任何問題(從來不關心10 MB文件,JNI給你更多)。您可以爲您的功能編寫一個C++ DLL,並且可以實現一個Java接口以使用JNI調用它們。一個新的替代方案被稱爲巴拿馬項目。我認爲JNI是達到巴拿馬完成日期的最佳方式,我們會看到巴拿馬將是最好的,否則JNI將持有現在的位置。

+0

但是dll不會與linux一起工作。我必須在linux上啓動 – 2014-09-29 12:08:25

+1

這並不重要,你可以在Linux中使用.so庫而不是在Windows中使用dll。 – 2014-09-29 13:27:10

+0

我應該閱讀圖像在哪些數據類型在C++?所以我可以在java中顯示它 – 2014-09-30 05:56:06

0

由於性能原因,JNI是絕對必須的。但是,使用起來相當不方便,所以這就是爲什麼我在JNI之上創建了工具來促進JNI與C++的使用:JavaCVJavaCPP。我最初爲了我自己的Java圖像處理目的開發它們,因此它們應該完全適合您自己的目的。查看demo video of ProCamTracker,我用它們製作的應用程序。它實時運行良好。