gpt4 book ai didi

android - 如何防止 JNIEnv 超出线程范围?

转载 作者:行者123 更新时间:2023-11-29 18:27:04 25 4
gpt4 key购买 nike

当我尝试从 C++ 中的线程调用 JVM 时,调试器说 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'

有没有不用 JNIEnv 或任何其他解决方案调用 JVM 的方法?

最佳答案

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

JavaVM* g_jvm;

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
g_jvm = vm;

...
return result;
}

然后使用此 g_jvm 执行 AttachCurrentThreadDetachCurrentThread,例如

void foo() 
{
jint res = javaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
if (res != JNI_OK) {
res = javaVM->AttachCurrentThread(&env, NULL);
if (JNI_OK != res) {
return NULL;
}
}

...

g_jvm->DetachCurrentThread();
}

参见:https://github.com/russell-shizhen/JniExample/blob/master/app/src/main/cpp/native-lib.cpp

关于android - 如何防止 JNIEnv 超出线程范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58256495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com