我正在製作一個lib,以便cpp應用程序可以與JVM進行通信。假設JVM已經開始如何讓一個cpp二進制與JVM進行通信?我認爲最好的解決方案是將JNI env變量存儲在共享對象中(so),以便我可以將它包含在cpp中並稍後使用。我可以存儲JNI Java Env變量嗎?
這可能嗎?
編輯----
我想在JavaVM接口的JVM之外,這樣的方法:
- GetJavaVM返回當前虛擬機實例的JavaVM的接口指針。
我正在製作一個lib,以便cpp應用程序可以與JVM進行通信。假設JVM已經開始如何讓一個cpp二進制與JVM進行通信?我認爲最好的解決方案是將JNI env變量存儲在共享對象中(so),以便我可以將它包含在cpp中並稍後使用。我可以存儲JNI Java Env變量嗎?
這可能嗎?
編輯----
我想在JavaVM接口的JVM之外,這樣的方法:
你的問題不清楚:這聽起來像你想有一個C++應用程序與在JVM上運行作爲一個單獨的進程進行通信。在這種情況下,您需要使用某種形式的進程間通信,例如管道,套接字,CORBA等等。與所有指針一樣,JNIEnv指針僅在使用它的過程中有效。
,我覺得適合你的問題是,如果你啓動一個Java程序,調用到一個本地方法,那麼本地方法啓動獨立的線程的唯一情況。在這種情況下,不,你不能共享JNIEnv指針,因爲它綁定到一個線程。但是,您可以使用JNI invocation API從C++線程訪問Java VM。
不,我不這麼認爲。 JVM在啓動時獲取環境,在程序運行期間不能從外部進程更改。
這些日子的標準程序是程序使用TCP/IP和套接字進行通信。對於一個簡單而便宜的解決方案,你可以考慮在一個目錄中使用文件(當然,儘管這存在性能和併發問題)。
我剛剛注意到「我在做一個lib」的聲明。如果你的lib是用於「公共」消費的,它應該是跨平臺的,然後我認爲套接字I/O是要做的事情。
你可能劫持JMX做你問什麼,但我不上很懂行。
你在這裏有多少個進程?如果這一切都在一個過程中,那麼答案是'是'。 C++可以從jni.h中調用GetEnv API。
這是2過程:( – 2010-01-04 13:43:56
時間來創建一個可以用C++說話的Java的Web服務? – bmargulies 2010-01-04 16:59:43
這就是我想要的,我有2個與JVM的本機lib將存儲指針和另一個只有C++代碼將使用此lib。我希望其他進程(僅限C++)使用lib並調用jvm(其他進程)。 – 2010-01-04 13:34:58
如果從我的帖子中不清楚,你不能那樣做。 – kdgregory 2010-01-04 13:45:18
我想也許是可能使一個方法「連接」在本地庫執行以下操作: *返回與GetJavaVM在JavaVM指針() 現在與JavaVM的指針調用AttachCurrentThread()。 我的問題是,如果是可能的,因爲他們沒有被線程,而是由工藝:( – 2010-01-04 13:58:17