2013-08-27 51 views
3

我使用C++作爲我的本地工作。我能夠創建(C++)共享庫,並且能夠調用java函數共享庫的幫助。如何在多線程環境中使用JNI_CreateJavaVm(C++)

步驟涉及我的過程:

1)通過使用JNI_CreateJavaVm創建VM [IN C++]與所創建的VM

2)過程。

3)如果我將再次做同樣的過程中JNI_CreateJavaVm也沒有創造任何虛擬機,它返回的JNI錯誤代碼爲-1(未知的錯誤)。然後我檢查了從Thread

退出getCreatedJavaVMs返回返回0,而我試圖讓GetEnv env它崩潰。

我也試過功能GetJavaVM但它越來越與錯誤信息墜毀,

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x00c1b3ed, pid=8645, tid=2961177456 
# 
# JRE version: 7.0_25-b15 
# Java VM: Java HotSpot(TM) Server VM (23.25-b01 mixed mode linux-x86) 
# Problematic frame: 
# C [libVsphere.so+0x6a3ed] _Jv_JNIEnv::GetJavaVM(_Jv_JavaVM**)+0xb 

爲什麼它正在發生,以及如何解決這一問題?

如何在多線程環境中使用JNI_CreateJavaVm,JNI_GetCreatedVMs和GetJavaVM。

回答

4

您應該只有一個全局實例在JavaVM在開始程序中只有一個線程創建:

/* Global instance */ 
JavaVM *jvm; 

int main() { 
/* ...call to JNI_CreateJavaVm ...*/ 
} 

然後在每個線程上,如果你想抓住的Java環境,你應該這樣做利用全球指針渣機(JVM ):使用環境中,您可以訪問方法/類

JNIEnv *env; 
(*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); 

Finall等:

jclass ex = (*env)->FindClass(env, "java/lang/NullPointerException"); 
3

您可以使用AttachCurrentThread()將當前線程附加到現有Java VM。沒有必要爲每個線程創建JavaVM。