我想知道从JNI函数JNIEnv *
获得的AttachCurrentThread()
的生命周期。请考虑以下检索JNIEnv
指针的函数。
JNIEnv * RetrieveJniEnvPtr()
{
JavaVM * pJavaVM; // Assume pJavaVM is already initialized
JNIEnv * pEnv = NULL;
if(pJavaVM->GetEnv((void**)&pEnv, JNI_VERSION_1_6) != JNI_OK)
{
pJavaVM->AttachCurrentThread((void**) &pEnv, NULL);
}
return pEnv;
}
是否有与AttachCurrentThread()
的调用关联的清理调用?
另外,这是一个轻量级的功能吗?是标准编程实践在同一个线程中多次调用(在本例中)RetrieveJniEnvPtr()
- 或者代码是否只在线程的生命周期内检索JNIEnv *
一次?
答案 0 :(得分:6)
清理功能为DetachCurrentThread()
。您需要构建代码,以便知道您是否在现有的Java线程中,在这种情况下,您已经将JNIEnv*
传递到JNI方法中,或者您已经在您自己设计的本机主题,在这种情况下,您必须在任何其他JNI呼叫之前呼叫AttachCurrentThread()
,之后再DetachCurrentThread()
。不要试图隐瞒这一要求。