2013-08-27 3 views
3

저는 C++을 기본 언어로 사용하고 있습니다. (C++) 공유 라이브러리를 만들 수 있으며 다음과 함께 Java 함수를 호출 할 수 있습니다. 공유 라이브러리의 도움. 내 과정에 참여다중 스레드 환경에서 JNI_CreateJavaVm을 사용하는 방법 (C++)

단계 :

1) JNI_CreateJavaVM는을 사용하여 VM을 생성 생성 된 VM에

2) 프로세스 [C++ IN]..

스레드

3) 출구 I가 확인 그 때는 다시는)이 JNI_CreateJavaVM는 모든 VM이 생성되지 않고, -1 (알 에러 등 JNI 에러 코드를 반환하는 동일한 프로세스를 수행한다면 getCreatedJavaVMs는 GetEnv를 사용하여 env를 얻으려고 시도하는 동안 0을 반환하는 값을 반환합니다.

는 또한 기능 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

당신은 단지 하나의 글로벌 인스턴스가한다 자바 시스템으로 글로벌 포인터를 사용 (JVM) :

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

하면 마지막 당신이 방법/클래스에 액세스 할 수있는 환경을 사용하는 등 :

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

AttachCurrentThread()을 사용하면 현재 스레드를 기존 Java VM에 연결할 수 있습니다. 모든 스레드에 대해 JavaVM을 작성할 필요가 없습니다. 당신은 자바 환경을 잡아하려는 경우

/* Global instance */ 
JavaVM *jvm; 

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

그런 다음 각 스레드에, 당신이 그것을 어떻게해야 다음의 JavaVM이 하나 개의 스레드에서 프로그램의 시작에 생성의

관련 문제