bberdong的专栏

在网上能找到有关

关于这个的解决办法,能搜到的都基本一模一样。变量名都不带改的。

比如:

基本都是通过

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");

,穿别人的鞋,走自己的路,让别追去吧

bberdong的专栏

相关文章:

你感兴趣的文章:

标签云: