JNI使用(异步条件下)
1、JNI异步条件下(多线程/回调函数),如何取得JNIEnv
使用AttachCurrentThread()函数。
示例代码:
#ifdefJNI_VERSION_1_4
jintres=cached_jvm->AttachCurrentThread((void**)&env,NULL);
#else
jintres=cached_jvm->AttachCurrentThread(&env,NULL);
#endif;
if(env==NULL)
return;
jclassclsSctp=env->FindClass("com/sunrising/nettest/netpackage/implement/SCTPTransImplement");
if(clsSctp==NULL)
{
ThrowNullPointerException(env,"SCTPclassisnull");
cached_jvm->DetachCurrentThread();
return;
}
jmethodIDmid=env->GetStaticMethodID(clsSctp,"communicationErrorNotify","(JJ)V");
if(mid==0){
ThrowNullPointerException(env,"MethodcommunicationErrorNotify()isnull");
cached_jvm->DetachCurrentThread();
return;
}
env->CallStaticVoidMethod(clsSctp,mid,jlAssociationID,jlErrorType);
cached_jvm->DetachCurrentThread();
2、使用GetStringUTFChars()之后要注意释放内存
使用上述函数之后,要使用ReleaseStringUTFChars()函数释放字符串内存。
示例代码:
pBuffer=env->GetStringUTFChars(jsAmrFile,&isCopy);
strncpy_s(szAmrFile,MAX_STRING,pBuffer,MAX_STRING-1);
if(isCopy&0xFF)
{
env->ReleaseStringUTFChars(jsAmrFile,pBuffer);
}