jni获取java线程_JNI异步条件下(多线程/回调函数),如何取得JNI Env | 学步园

在JNI异步或多线程场景中,通过AttachCurrentThread获取JNI Env进行Java线程操作。示例展示了如何查找并调用Java类及方法,并在使用GetStringUTFChars获取字符串后,使用ReleaseStringUTFChars释放内存。
摘要由CSDN通过智能技术生成

1、JNI异步条件下(多线程/回调函数),如何取得JNI Env

使用AttachCurrentThread()函数。

示例代码:

#ifdef JNI_VERSION_1_4

jint res = cached_jvm->AttachCurrentThread((void**)&env, NULL);

#else

jint res = cached_jvm->AttachCurrentThread(&env, NULL);

#endif;

if (env == NULL)

return;

jclass clsSctp = env->FindClass("com/sunrising/nettest/netpackage/implement/SCTPTransImplement");

if (clsSctp == NULL)

{

ThrowNullPointerException(env, "SCTP class is null");

cached_jvm->DetachCurrentThread();

return;

}

jmethodID mid = env->GetStaticMethodID(clsSctp, "communicationErrorNotify", "(JJ)V");

if (mid == 0) {

ThrowNullPointerException(env, "Method communicationErrorNotify() is null");

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值