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);

}

相关推荐