美文网首页
Android NDK开发的POSIX线程标准

Android NDK开发的POSIX线程标准

作者: 蓝胖子_Android | 来源:发表于2017-10-19 11:38 被阅读0次

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

}

相关文章

网友评论

      本文标题:Android NDK开发的POSIX线程标准

      本文链接:https://www.haomeiwen.com/subject/lyluuxtx.html