我正在创建一个带有参数dispatchInputs的线程,它是一个CString数组 但是,当我需要在DispFrontEnd函数中使用“env”时,一个线程可以使用全局变量“env”吗?如果不是我怎么能把它作为参数传递给DispFrontEnd?
static JNIEnv *env; static JavaVM *jvm; JNIEnv* startJVM() { JNIEnv *env; JavaVM * jvm; env = create_vm(&jvm); if ( env == NULL) { logloc->LogDebug("1env == NULL ******************");} return env; } env = startJVM(); hDispThread = (HANDLE)_beginthread(DispFrontEnd,0,(void *)dispatchInputs); static void DispFrontEnd(void * indArr) { CString str; CString dest[56]; char* orig_idx_ptr = reinterpret_cast(indArr); int array_size = 56; memcpy(dest, orig_idx_ptr, array_size); str.Format("DISPATCH INPUTS: (Trace Detail)[%s] (Session State ID)[%s] (SessionID)[%s] (MediaTypeID)[%s] (MediaCode)[%s] (5)[%s] (6)[%s] (7)[%s] (8)[%s] (9)[%s] (10)[%s] (11)[%s] (12)[%s] (13)[%s] " , dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7], dest[8], dest[9], dest[10], dest[11], dest[12], dest[13]); logloc->LogMethod(str ); if (env != NULL) { jclass clsR = NULL; jclass arqClass = NULL; jclass messageToHostClass = NULL; jobject jobjRetData = NULL; jobjectArray jobjWOArr = NULL; jobjectArray getResponseArray = NULL; jmethodID getResponse = NULL; jmethodID getMessageToHost = NULL; arqClass = env->FindClass("BizB/Arq"); }
韩国社交协会 转
答案 0 :(得分:2)
是的,线程可以使用全局变量的值!
答案 1 :(得分:0)
请参阅Is it ok to save JavaVM * and JNIEnv * as a global variable and use it elsewhere?
JNIEnv“表示特定JNI方法调用的上下文。它依赖于当前线程,当前方法的参数,当前方法创建的本地引用,各种事物,以及它一旦JNI方法返回,它就变为无效。“
此答案:How to create static JNI Environment Pointer?
“缓存JNIEnv *实例并继续使用它通常是不安全的”