2011-01-10 35 views
0

我有我編譯和創建一個完全獨立的C++程序庫。有兩個cpp文件,一個具有主功能,另一個具有所有功能。地圖現有的C++函數JNI

目前,這一計劃實現與Java的ProcessBuilder與參數傳遞給調用C++程序和C++程序的結果只是簡單的外出文件。現在

,我希望得到一個什麼的工作回到我的Java程序,C++函數的結果。 (在C++函數的結果是雙無符號字符數組)

所以我的問題是 - 有什麼辦法可以映射那些現有的庫函數,這樣我可以從我的java程序直接調用它們,仍然保留使用圖書館在我目前是獨立的方式,這是通過該驅動程序C++程序main()?

我基本上是試圖避免編譯相同的庫兩次 - 一次JNI的功能,一旦作爲一個獨立的C++程序

感謝

回答

0

Java Native Access (JNA)會做你想要什麼。

Java Native Interface (JNI)需要在Java和C++之間增加一層C glue。但JNA可以從Java直接訪問一些C函數。

你可能需要聲明你的函數extern「C」。您不必重新編譯庫,但必須將其與C++主函數鏈接。

如果你有一個很大的C++類庫需要公開,那麼你可能會對SWIG感興趣。但對於單個C函數,JNA可能就足夠了。

0

我覺得一個EXE可以導出類似於DLL函數(在windows上使用__declspec(dllexport)),這意味着你可以加載它類似於jni-dll。 (您可能需要將其重命名爲.dll或.so,以便讓java加載它。)

0

如果加載不起作用,另一種方法是在與現在一樣的單獨進程中啓動程序,但要它是一個命令行選項,它與Java程序建立某種共享內存區域。

這將避免複製大亞灣來回,但可能需要由EXE和Java程序都加載一個小工具DLL,即不要太簡單。 (不知道Java可以設置共享內存輕鬆W/O本地C調用..)

(保持分開答案投票/評論/接受粒度)

0

創建運行JNI封裝DLL可執行並返回字符。或者,將相關代碼編譯到靜態庫中,並將其鏈接到獨立程序的main()函數或從Java調用的JNI存根。進程中總是更好。

0

我相信一個正確的方法是首先將你的函數編譯成一個獨立的動態庫(.dll/.so/.dylib)。 然後,您可以:

  • 寫一個C++的可執行文件,對你的共享庫鏈接的
  • 寫結合到C Java程序++庫拜BridJ,例如(或JNA,如果你堅持老式C)