linux jni 多线程,JNI多线程

这篇博客详细介绍了在JavaVM中如何获取JNIEnv,特别是在多线程环境下。首先在JNI_OnLoad函数中保存JavaVM指针,然后在子线程中通过AttachCurrentThread获取JNIEnv,并使用它来调用静态方法获取UUID。最后,通过DetachCurrentThread断开线程关联。整个过程展示了Java与C/C++交互的关键步骤。
摘要由CSDN通过智能技术生成

JavaVM 代表的是Java虚拟机,所有的工作都是从JavaVM开始

可以通过JavaVM获取到每个线程关联的JNIEnv

如何获取JavaVM?

在JNI_OnLoad函数中获取

(*env)->GetJavaVM(env,&javaVM);

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){

LOGI("%s","JNI_OnLoad");

javaVM = vm;

return JNI_VERSION_1_4;

}

每个线程都有独立的JNIEnv

初始化

//获取class必须要在主线程中

jclass uuidutils_class_tmp = (*env)->FindClass(env,"com/dongnaoedu/androidlinux/UUIDUtils");

//创建全局引用

uuidutils_class_global = (*env)->NewGlobalRef(env,uuidutils_class_tmp);

//获取jmethodId也可以在子线程中

uuidutils_get_mid = (*env)->GetStaticMethodID(env,uuidutils_class_global,"get","()Ljava/lang/String;");

创建多线程

void* th_fun(void* arg){

int i;

for (i = 0; i < 5; i++) {

JNIEnv* env;

//关联参数

//JavaVMAttachArgs args = {JNI_VERSION_1_4, "my_thread", NULL};

//(*javaVM)->AttachCurrentThread(javaVM,&env,&args);

(*javaVM)->AttachCurrentThread(javaVM,&env,NULL);

jobject uuid_jstr = (*env)->CallStaticObjectMethod(env,uuidutils_class_global,uuidutils_get_mid);

const char* uuid_cstr = (*env)->GetStringUTFChars(env,uuid_jstr,NULL);

LOGI("uuid:%s",uuid_cstr);

//退出线程

if(i == 4){

goto end;

}

sleep(1);

}

end:

//取消关联

(*javaVM)->DetachCurrentThread(javaVM);

pthread_exit((void*)0);

}

pthread_t tid;

pthread_create(&tid, NULL,th_fun,(void*)"NO1");

销毁

(*env)->DeleteGlobalRef(env,uuidutils_class_global);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>