在网上能找到有关
关于这个的解决办法,能搜到的都基本一模一样。变量名都不带改的。
比如:
基本都是通过
fields.pjvm->AttachCurrentThread(&env, NULL);env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg);Fields.pjvm->DetachCurrentThread();
这种方式来解决线程问题。
今天偶然发现一种挺好的方式:
JNIEXPORT jint JNICALL Reset (JNIEnv *env, jclass cls){SET_ENV(env);…..} void SET_ENV(JNIEnv* env){pid_t tid = syscall(__NR_gettid); // current thread idg_JNIENV_Map[tid] = env;}
下面这部分是抄来的
//systemcallnumber:#define__NR_gettid224
因此,要获取某个线程的
或者比较elegant的方式是:
PS:
pid_ttid=syscall(__NR_gettid);//currentthreadid
JNIEnv* GET_ENV(){pid_t tid = syscall(__NR_gettid); // current thread id map<pid_t, JNIEnv*>::iterator it = g_JNIENV_Map.find(tid);if (it == g_JNIENV_Map.end()){return NULL;}else{return it->second;}} 这样,你在需要使用env的时候就能根据当前线程找到对应的正确的env指针了。JNIEnv *env = GET_ENV();jclass cls = env->FindClass(XXX);jmethodID methodId = env->GetStaticMethodID(cls, "showDialog", "()V");
,穿别人的鞋,走自己的路,让别追去吧