线程可以使用全局变量的值吗?

时间:2010-01-28 16:43:52

标签: multithreading java-native-interface

我正在创建一个带有参数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");


}

韩国社交协会 转

2 个答案:

答案 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 *实例并继续使用它通常是不安全的”