一、原理
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");
}