2023-01-19 347
我有一个用于java函数的JNI包装器,这些包装器是从C中调用的…我试图从不同线程调用一些方法,并且在尝试获得JNienv指针的新副本时会遇到错误…我使用的代码在下面,在每种方法中都调用:
JNIEnv* GetJniEnvHandle(){
ThreadInfo();
JNIEnv *envLoc;
//if(Thread::CurrentThread->IsBackground || Thread::CurrentThread->IsThreadPoolThread)
jint envRes = vm->GetEnv((void**)&envLoc, JNI_VERSION_1_4);
if(envRes == JNI_OK){
if(ThreadId != Thread::CurrentThread->ManagedThreadId)
jint res = vm->AttachCurrentThread((void**)&envLoc, NULL);
}else{
Log("Error obtaining JNIEnv* handle");
}
return envLoc;
}
从主/初始线程调用时,JVM已经实例化,此(和其他方法)运行.当我获得Envres的值时,它在子线程中时会保持-2.
请参阅文档到Attaching to the VM章.
您需要至少对每个本机线程调用AttachCurrentThread()才能使用任何JNI函数.
Java中创建的线程已经连接.
因此,每当GetEnv呼叫失败呼叫AttachCurrentThread()时,我就可以了.或确保当您创建子线程时,将其连接到VM.
以上所述是小编给大家介绍的JNI-多线程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25817.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态