JNI 之 pthread 多线程使用

一、原理

1、在jni中使用pthread实现多线程

二、实现

 1、创建native方法

2、使用javah命令生成头文件

3、在c文件中实现native方法

#include <jni.h>
#include <pthread.h>
#include "com_xiaofan_testndk_NDKUtils.h"
#include <stdio.h>
#include <android/log.h>
#include <unistd.h>

#define LOGI(FORMAT, ...)  __android_log_print(ANDROID_LOG_INFO,"wanxiaofan",FORMAT,__VA_ARGS__);
#define LOGE(FORMAT, ...)  __android_log_print(ANDROID_LOG_ERROR,"wanxiaofan",FORMAT,__VA_ARGS__);


JavaVM *javaVM;
jobject uuidutils_class_gloable;
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
    //获取到JavaVM
    javaVM = vm;
    LOGI("%s", "JNI_OnLoad");
    return JNI_VERSION_1_4;
}

void *th_fun(void *arg) {
    JNIEnv *env = NULL;
    //通过JavaVM关联当前线程,获取当前线程的JNIEnv
    (*javaVM)->AttachCurrentThread(javaVM, &env, NULL);

    jmethodID jmid = (*env)->GetStaticMethodID(env, uuidutils_class_gloable, "get", "()Ljava/lang/String;");

    char *no = (char *) arg;
    int i;
    for (i = 0; i < 6; ++i) {
        LOGI("thread %s ,i:%d", no, i);
        jobject uuid = (*env)->CallStaticObjectMethod(env, uuidutils_class_gloable, jmid);
        const  char * uuid_cstr = (*env)->GetStringUTFChars(env, uuid, NULL);
        LOGI("这是uuid----%s", uuid_cstr);
        if (i == 5) {
            goto end;
        }

        (*env)->ReleaseStringUTFChars(env, uuid, uuid_cstr);

        sleep(1);
    }
    end:
    //解除关联
    (*javaVM)->DetachCurrentThread(javaVM);
    //退出线程
    pthread_exit((void *) 0);
}


JNIEXPORT void JNICALL Java_com_xiaofan_testndk_NDKUtils_PosixThread
        (JNIEnv *env, jclass jcls) {


    //(*env)->GetJavaVM(env, &javaVM);
    jclass uuidUtils_jcls = (*env)->FindClass(env, "com/xiaofan/testndk/UUIDUtils");
     uuidutils_class_gloable = (*env)->NewGlobalRef(env, uuidUtils_jcls);
    //创建多线程
    pthread_t tid;

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


}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值