Может ли поток использовать значение глобальной переменной? - PullRequest
0 голосов
/ 28 января 2010

Я создаю поток, который принимает в качестве параметра dispatchInputs, который является массивом CString но в то время как мне нужно использовать «env» в функции DispFrontEnd, может ли поток использовать глобальную переменную «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");


}

Tks Rev

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

да, поток может использовать значение глобальной переменной!

0 голосов
/ 21 октября 2013

См. Можно ли сохранить JavaVM * и JNIEnv * в качестве глобальной переменной и использовать ее в другом месте?

JNIEnv "представляет контекст для конкретного вызова метода JNI. Он зависит от текущего потока, аргументов текущего метода, локальных ссылок, которые были созданы текущим методом, всех видов вещей, и становится недействительным, как только возвращается метод JNI. "

Также ответ: Как создать статический указатель среды JNI?

"Как правило, кешировать экземпляр JNIEnv * и продолжать его использовать обычно небезопасно"

...