JNIEnv因線程不同而不同耍共,不能直接 globalRef 或者 static extern寞焙,
每次從JavaVM *vm中獲取,因?yàn)榫€程獨(dú)立抖所。JavaVM從JNI_OnLoad中獲取
bool getCurEnv(JNIEnv **env_jni, bool *shouldDetach_jni) {
*shouldDetach_jni = false;
JNIEnv *env = NULL;
if (vm_btalk->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
// LOGD("GetEnv failed -> AttachCurrentThread");
if (vm_btalk->AttachCurrentThread(&env, NULL) < 0) {
LOGE("call AttachCurrentThread error! vm_btalk = %p, env = %p", vm_btalk, env);
return false;
}
else
// LOGD("AttachCurrentThread success");
*shouldDetach_jni = true;
}
env = NULL;
vm_btalk->GetEnv((void **)&env, JNI_VERSION_1_4);
*env_jni = env;
return true;
}
使用后釋放行拢,如下
//detach thread
if (env != NULL && shouldDetach) {
vm_btalk->DetachCurrentThread();
LogUtils::getInstance()->logD("D DetachCurrentThread() finished in " + fun);
}