@@ -120,19 +120,26 @@ std::string javaMethodCallToString(JNIEnv *env, jobject obj, jmethodID methodId,
120120 return result.str ();
121121}
122122
123- JNIEnv* javaAttachCurrentThread (JavaVM* jvm, jobject classLoader) {
124- JNIEnv* env;
125- JavaVMAttachArgs attachArgs;
126- attachArgs.version = JNI_VERSION_1_4;
127- attachArgs.name = NULL ;
128- attachArgs.group = NULL ;
129- jvm->AttachCurrentThread ((void **)&env, &attachArgs);
130-
131- jclass threadClazz = env->FindClass (" java/lang/Thread" );
132- jmethodID thread_currentThread = env->GetStaticMethodID (threadClazz, " currentThread" , " ()Ljava/lang/Thread;" );
133- jmethodID thread_setContextClassLoader = env->GetMethodID (threadClazz, " setContextClassLoader" , " (Ljava/lang/ClassLoader;)V" );
134- jobject currentThread = env->CallStaticObjectMethod (threadClazz, thread_currentThread);
135- env->CallObjectMethod (currentThread, thread_setContextClassLoader, classLoader);
123+ JNIEnv* javaGetEnv (JavaVM* jvm, jobject classLoader) {
124+ JNIEnv *env = NULL ;
125+ int ret = jvm->GetEnv ((void **)&env, JNI_VERSION_1_6);
126+
127+ if (ret == JNI_EDETACHED) {
128+ JavaVMAttachArgs attachArgs;
129+ attachArgs.version = JNI_VERSION_1_6;
130+ attachArgs.name = NULL ;
131+ attachArgs.group = NULL ;
132+ jvm->AttachCurrentThread ((void **)&env, &attachArgs);
133+
134+ jclass threadClazz = env->FindClass (" java/lang/Thread" );
135+ jmethodID thread_currentThread = env->GetStaticMethodID (threadClazz, " currentThread" , " ()Ljava/lang/Thread;" );
136+ jmethodID thread_setContextClassLoader = env->GetMethodID (threadClazz, " setContextClassLoader" , " (Ljava/lang/ClassLoader;)V" );
137+ jobject currentThread = env->CallStaticObjectMethod (threadClazz, thread_currentThread);
138+ env->CallObjectMethod (currentThread, thread_setContextClassLoader, classLoader);
139+
140+ env->DeleteLocalRef (threadClazz);
141+ env->DeleteLocalRef (currentThread);
142+ }
136143
137144 return env;
138145}
@@ -145,10 +152,6 @@ jobject getSystemClassLoader(JNIEnv *env) {
145152 return env->CallObjectMethod (currentThread, thread_getContextClassLoader);
146153}
147154
148- void javaDetachCurrentThread (JavaVM* jvm) {
149- jvm->DetachCurrentThread ();
150- }
151-
152155jvalueType javaGetType (JNIEnv *env, jclass type) {
153156 jclass clazzClazz = env->FindClass (" java/lang/Class" );
154157 jmethodID class_isArray = env->GetMethodID (clazzClazz, " isArray" , " ()Z" );
@@ -704,4 +707,4 @@ std::string methodNotFoundToString(JNIEnv *env, jclass clazz, std::string method
704707 }
705708
706709 return msg.str ();
707- }
710+ }
0 commit comments