1,创建线程:pthread.h
pthread_t tid;
//tread_fun是线程中执行的函数
pthread_create(&tid,NULL,tread_fun,"线程名称");
2,互斥锁和条件变量
//互斥锁
pthread_mutex_t mutex;
//初始化互斥锁:
pthread_mutex_init(&mutex,NULL);
//条件变量
pthread_cond_t flag;
//初始化条件变量
pthread_cond_init(&flag,NULL);
3,线程等待
pthread_cond_wait(&flag,&mutex);
4,线程锁与解锁 唤醒
//锁定
pthread_mutex_lock(&mutex);
//唤醒
pthread_cond_signal(&flag);
//解锁
pthread_mutex_unlock(&mutex);
5,代码示例:
#include"xm_com_android_linux_PosixThread.h"
#include
#include
#include
#defineTAG"xm"// 这个是自定义的LOG的标识
#defineLOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)// 定义LOGD类型
#defineLOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)// 定义LOGI类型
#defineLOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__)// 定义LOGW类型
#defineLOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)// 定义LOGE类型
#defineLOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG,__VA_ARGS__)// 定义LOGF类型
JavaVM* javaVm;
jobjectg_obj =NULL;
JNIEXPORTjintJNI_OnLoad(JavaVM* vm,void* reserved){
javaVm=vm;
__android_log_print(ANDROID_LOG_INFO,"xm","JNI_OnLoad");
returnJNI_VERSION_1_4;
}
JNIEXPORTvoidJNI_OnUnload(JavaVM* vm,void* reserved){
LOGI("JNI_OnUnload");
}
void* th_fun(void*arg){
JNIEnv*env=NULL;
//通过javaVM 关联当前线程,获取当前线程的JNIEnv
(*javaVm)->AttachCurrentThread(javaVm,&env,NULL);
if(env==NULL){
__android_log_print(ANDROID_LOG_INFO,"xm","env is null");
return0;
}
jclassuuidutils_jcls=(*env)->GetObjectClass(env,g_obj);
if(uuidutils_jcls==NULL){
__android_log_print(ANDROID_LOG_INFO,"xm","jclass is null");
return0;
}
jmethodIDjmethod_getUUID_id=(*env)->GetStaticMethodID(env,uuidutils_jcls,"getUUID","()Ljava/lang/String;");
if(jmethod_getUUID_id==NULL){
__android_log_print(ANDROID_LOG_INFO,"xm","jmethod_id is null");
return0;
}
char* no=(char*)arg;
inti;
for(i=0;i<5;i++){
__android_log_print(ANDROID_LOG_INFO,"xm","thread =%s, i=%d",no,i);
jobjectuuid=(*env)->CallStaticObjectMethod(env,uuidutils_jcls,jmethod_getUUID_id);
char* uuidStr=(*env)->GetStringUTFChars(env,uuid,NULL);
__android_log_print(ANDROID_LOG_INFO,"xm","uuidStr =%s, i=%d",uuidStr,i);
if(i==4){
//解除关联
(*javaVm)->DetachCurrentThread(javaVm);
pthread_exit((void*)0);
}
(*env)->ReleaseStringChars(env,uuid,uuidStr);
sleep(1);
}
}
/**
* 每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,
* 内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,
* 虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
* JavaVM:代表的是java虚拟机,所有的工作都是从JavaVM开始
* 每个线程都有自己的独立的JNIEnv
* 可以通过JavaVM获取到每个线程关联的JNIEnv.
* 1,在JNI_OnLoad中获取
* 2, (*env)->GetJavaVM(env,vm);
*/
JNIEXPORTvoidJNICALLJava_xm_com_android_1linux_PosixThread_pthread
(JNIEnv* env,jobjectjobj){
//创建多线程
pthread_ttid;
pthread_create(&tid,NULL,th_fun,(void* )"NO1");
}
JNIEXPORTvoidJNICALLJava_xm_com_android_1linux_PosixThread_initJni
(JNIEnv* env,jobjectjobj){
//不能直接赋值(g_obj = obj)
g_obj = (*env)->NewGlobalRef(env,jobj);
//保存全局JVM以便在子线程中使用
(*env)->GetJavaVM(env,&javaVm);
}