JNI-多线程

 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.

JNI-多线程

推荐答案

请参阅文档到Attaching to the VM章.

您需要至少对每个本机线程调用AttachCurrentThread()才能使用任何JNI函数.
Java中创建的线程已经连接.
因此,每当GetEnv呼叫失败呼叫AttachCurrentThread()时,我就可以了.或确保当您创建子线程时,将其连接到VM.

以上所述是小编给大家介绍的JNI-多线程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25817.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。