Android 如何防止JNIEnv超出线程中的范围? 当我试图从C++中调用JVM时,DeBbgg说JNIEnv指针已经不存在了。代码: void thread_call(JNIEnv* env,jobject text_view,jmethodID setText,const char* str){ env->CallVoidMethod(text_view,setText,env->NewStringUTF(str)); } JNIEXPORT jstring JNICALL Java_com_example_project_1lenspath_MainActivity_initPullThread( JNIEnv *env, jobject, jobject text_view){ ... std::thread pull(thread_call,env,text_view,setText,std::to_string(t).c_str()); ... } //Debugger: error: use of undeclared identifier 'env'

Android 如何防止JNIEnv超出线程中的范围? 当我试图从C++中调用JVM时,DeBbgg说JNIEnv指针已经不存在了。代码: void thread_call(JNIEnv* env,jobject text_view,jmethodID setText,const char* str){ env->CallVoidMethod(text_view,setText,env->NewStringUTF(str)); } JNIEXPORT jstring JNICALL Java_com_example_project_1lenspath_MainActivity_initPullThread( JNIEnv *env, jobject, jobject text_view){ ... std::thread pull(thread_call,env,text_view,setText,std::to_string(t).c_str()); ... } //Debugger: error: use of undeclared identifier 'env',android,android-ndk,java-native-interface,jnienv,Android,Android Ndk,Java Native Interface,Jnienv,有没有办法在没有JNIEnv或任何其他解决方案的情况下调用JVM?您可以将JVM指针缓存在JNI_OnLoad中,例如 JavaVM*g_-jvm; jint JNI_OnLoad(JavaVM*vm,void*reserved) { g_jvm=vm; ... 返回结果; } 然后使用此g_jvm执行AttachCurrentThread和DetachCurrentThread,例如 void foo() { jint res=javaVM->GetEnv((void**)和env,JNI\

有没有办法在没有JNIEnv或任何其他解决方案的情况下调用JVM?

您可以将JVM指针缓存在
JNI_OnLoad
中,例如

JavaVM*g_-jvm;
jint JNI_OnLoad(JavaVM*vm,void*reserved)
{
g_jvm=vm;
...
返回结果;
}
然后使用此
g_jvm
执行
AttachCurrentThread
DetachCurrentThread
,例如

void foo()
{
jint res=javaVM->GetEnv((void**)和env,JNI\u版本1\u 6);
如果(res!=JNI_OK){
res=javaVM->AttachCurrentThread(&env,NULL);
如果(JNI_OK!=res){
返回NULL;
}
}
...
g_jvm->DetachCurrentThread();
}

请参阅:

pull
线程不应接收
JNIEnv*
作为参数。相反,它应该使用
AttachCurrentThread
DetachCurrentThread
来获取和处理自己的
JNIEnv*
foo
应该跟踪是否调用了
AttachCurrentThread
,如果是这样的话,只调用
DetachCurrentThread
。这看起来有点像解决方案,但它仍然需要超出范围的env指针。
env
也可以全局缓存。