2010-01-04 68 views
4

我正在製作一個lib,以便cpp應用程序可以與JVM進行通信。假設JVM已經開始如何讓一個cpp二進制與JVM進行通信?我認爲最好的解決方案是將JNI env變量存儲在共享對象中(so),以便我可以將它包含在cpp中並稍後使用。我可以存儲JNI Java Env變量嗎?

這可能嗎?

編輯----

我想在JavaVM接口的JVM之外,這樣的方法:

  • GetJavaVM返回當前虛擬機實例的JavaVM的接口指針。

回答

2

你的問題不清楚:這聽起來像你想有一個C++應用程序與在JVM上運行作爲一個單獨的進程進行通信。在這種情況下,您需要使用某種形式的進程間通信,例如管道,套接字,CORBA等等。與所有指針一樣,JNIEnv指針僅在使用它的過程中有效。

,我覺得適合你的問題是,如果你啓動一個Java程序,調用到一個本地方法,那麼本地方法啓動獨立的線程的唯一情況。在這種情況下,不,你不能共享JNIEnv指針,因爲它綁定到一個線程。但是,您可以使用JNI invocation API從C++線程訪問Java VM。

+0

這就是我想要的,我有2個與JVM的本機lib將存儲指針和另一個只有C++代碼將使用此lib。我希望其他進程(僅限C++)使用lib並調用jvm(其他進程)。 – 2010-01-04 13:34:58

+0

如果從我的帖子中不清楚,你不能那樣做。 – kdgregory 2010-01-04 13:45:18

+0

我想也許是可能使一個方法「連接」在本地庫執行以下操作: *返回與GetJavaVM在JavaVM指針() 現在與JavaVM的指針調用AttachCurrentThread()。 我的問題是,如果是可能的,因爲他們沒有被線程,而是由工藝:( – 2010-01-04 13:58:17

0

不,我不這麼認爲。 JVM在啓動時獲取環境,在程序運行期間不能從外部進程更改。

這些日子的標準程序是程序使用TCP/IP和套接字進行通信。對於一個簡單而便宜的解決方案,你可以考慮在一個目錄中使用文件(當然,儘管這存在性能和併發問題)。


我剛剛注意到「我在做一個lib」的聲明。如果你的lib是用於「公共」消費的,它應該是跨平臺的,然後我認爲套接字I/O是要做的事情。

你可能劫持JMX做你問什麼,但我不上很懂行。

0

你在這裏有多少個進程?如果這一切都在一個過程中,那麼答案是'是'。 C++可以從jni.h中調用GetEnv API。

+0

這是2過程:( – 2010-01-04 13:43:56

+0

時間來創建一個可以用C++說話的Java的Web服務? – bmargulies 2010-01-04 16:59:43

相關問題