似乎大多數與JNI(Java本地接口)相關的文檔或幫助程序庫都與從Java調用本地代碼有關。這似乎是它的主要用途,即使它有更多的功能。尋找一種方便的方式從C++調用Java
我想主要是在相反的方向工作:修改一個現有的(相當大的)可移植的C++程序,通過向它添加一些Java庫。例如,我想讓它通過JDBC調用數據庫,或者通過JMS調用消息隊列系統,或者發送電子郵件,或者調用我自己的Java類等。但是對於原始的JNI,這非常不愉快並且容易出錯。
所以我最好喜歡編寫可以調用Java類的C++代碼,就像C++/CLI可以調用CLR類一樣容易。喜歡的東西:
這樣,我就不會去manually do the work of getting the method ID by passing the name and the weird signature strings,並會從調用方法所造成的未檢查的API編程錯誤保護。實際上它看起來很像是等效的Java。
注:我還在談論使用JNI!作爲一項基礎技術,它非常適合我的需求。它「在進行中」並且高效。我不想在單獨的進程中運行Java並對其進行RPC調用。 JNI本身很好。我只是想要一個愉快的界面。
必須有一個代碼生成工具才能使等價的C++類,名稱空間,方法等完全匹配我指定的一組Java類所公開的內容。生成的C++類將會:
- 有成員函數接受它們的參數的類似包裝版本,然後執行必要的JNI voodoo來進行調用。
- 以相同的方式包裝返回值,以便以自然方式鏈接調用。
- 維護方法ID的每類靜態緩存,以避免每次都查找它們。
- 完全是線程安全的,便攜式的,開源的。
- 在每次方法調用後自動檢查異常並生成std C++異常。
- 當我以通常的JNI方式編寫本機方法時也適用,但我需要調用其他Java代碼。
- 該數組應該在原始類型和類之間完全一致地工作。
- 毫無疑問,當它們需要在局部參考框架之外生存時,需要像全局一樣來包裝引用 - 再次,對於所有數組/對象引用應該都是相同的。
這樣一個免費的,開源的,可移植的庫/工具是否存在或我在做夢?
注:我發現this existing question,但在這種情況下,OP遠沒有完美的苛求,因爲我是...
更新:關於SWIG評論使我this previous question,這似乎表明它主要是相反的方向,所以不會做我想要的。
重要
- 這是關於能夠編寫C++代碼,操縱Java類和對象,而不是倒過來(見標題!)
- 我已經知道JNI存在( )但是對JNI API的手寫代碼不必要的冗長,重複,容易出錯,不會在編譯時進行類型檢查等。如果您想要緩存方法ID和類對象,那麼它更加冗長。我想自動生成C++包裝類,爲我處理所有這些。
更新:我開始了我自己的解決方案的工作:
https://github.com/danielearwicker/cppjvm
如果已經存在,請讓我知道!
NB。如果你正在考慮在你自己的項目中使用它,請隨時留意,但請記住,現在代碼已經過了幾個小時了,到目前爲止我只寫了三個非常艱難的測試。
雖然我只用它用於C和Python ...一個很長的時間以前,還有[SWIG](http://www.swig.org/Doc1.3/Java.html)。 – 2011-09-24 08:52:24
查看更新:SWIG顯然不會這樣做。 –
你想在哪個編譯器/解釋器執行你的程序,C還是Java?如果是Java,那麼使用JNI是不可能的。 – Naved