对于Android开发来说,到了一定的深度时或多或少都会接触到C/C++底层的,因为开源的优秀的C/C++库实在是太多了,并且C/C++处理某些问题的性能会比用Java来处理高很多,比如:增量更新、FFmpeg、热修复、Jni层的双进程守护等等都是C/C++来开发的,而且解压现在的主流APP都会在它们的lib目录里面看到很多.so动态库,可见C/C++对于Android的重要性。而C/C++处理很多问题都需要放在线程中,所以我们就来讲讲Android-Jni中的线程,希望能对大家有一定的帮助~
我们都知道Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,什么是POSIX线程(百度百科)? POSIX线程库中有一系列Pthreads API方便我们对Linux线程的操作。所以我们在Android中使用C/C++线程也就转到了使用POSIX线程库。其中我们用到最多的就是以下11个对象或函数,他们都在头文件“pthread.h”中:
[cpp] view plain copy print?
- 1、pthread_t :用于声明一个线程对象如:pthread_t thread;
- 2、pthread_creat :用于创建一个实际的线程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其总共接收4个参数,第一个参数为pthread_t对象,第二个参数为线程的一些属性我们一般传NULL就行,第三个参数为线程执行的函数( void* threadCallBack( void *data) ),第四个参数是传递给线程的参数是void*类型的既可以传任意类型。
- 3、pthread_exit :用于退出线程如:pthread_exit(&thread),参数也可以传NULL。注:线程回调函数最后必须调用此方法,不然APP会退出(挂掉)。
- 4、pthread_mutex_t :用于创建线程锁对象如:pthread_mutex_t mutex;
- 5、pthread_mutex_init :用于初始化pthread_mutex_t锁对象如:pthread_mutex_init(&mutex, NULL);
- 6、pthread_cond_t :用于创建线程条件对象如:pthread_cond_t cond;
- 7、pthread_cond_init :用于初始化pthread_cond_t条件对象如:pthread_cond_init(&cond, NULL);
- 8、pthread_mutex_lock :用于上锁mutex,本线程上锁后的其他变量是不能被别的线程操作的如:pthread_mutex_lock(&mutex);
- 9、pthread_mutex_unlock :用于解锁mutex,解锁后的其他变量可以被其他线程操作如:pthread_mutex_unlock(&mutex);
- 10、pthread_cond_signal :用于发出条件信号如:pthread_cond_signal(&mutex, &cond);
- 11、pthread_cond_wait :用于线程阻塞等待,直到pthread_cond_signal发出条件信号后才执行退出线程阻塞执行后面的操作。
1、pthread_t :用于声明一个线程对象如:pthread_t thread;
2、pthread_creat :用于创建一个实际的线程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其总共接收4个参数,第一个参数为pthread_t对象,第二个参数为线程的一些属性我们一般传NULL就行,第三个参数为线程执行的函数( void* threadCallBack(void *data) ),第四个参数是传递给线程的参数是void*类型的既可以传任意类型。
3、pthread_exit :用于退出线程如:pthread_exit(&thread),参数也可以传NULL。注:线程回调函数最后必须调用此方法,不然APP会退出(挂掉)。
4、pthread_mutex_t :用于创建线程锁对象如:pthread_mutex_t mutex;
5、pthread_mutex_init :用于初始化pthread_mutex_t锁对象如:pthread_mutex_init(&mutex, NULL);
6、pthread_cond_t :用于创建线程条件对象如:pthread_cond_t cond;
7、pthread_cond_init :用于初始化pthread_cond_t条件对象如:pthread_cond_init(&cond, NULL);
8、pthread_mutex_lock :用于上锁mutex,本线程上锁后的其他变量是不能被别的线程操作的如:pthread_mutex_lock(&mutex);
9、pthread_mutex_unlock :用于解锁mutex,解锁后的其他变量可以被其他线程操作如:pthread_mutex_unlock(&mutex);
10、pthread_cond_signal :用于发出条件信号如:pthread_cond_signal(&mutex, &cond);
11、pthread_cond_wait :用于线程阻塞等待,直到pthread_cond_signal发出条件信号后才执行退出线程阻塞执行后面的操作。
以上就是我们在Android-Jni里面常用到的线程操作,下面举一个简单的创建线程的例子:
演示效果:
C++代码如下:
[cpp] view plain copy print?
- #include <jni.h>
- #include "AndroidLog.h"
- #include "pthread.h"
- pthread_t pthread;//线程对象
- void *threadDoThings(void *data)
- {
- LOGD("jni thread do things");
- pthread_exit(&pthread);
- }
- extern "C"
- JNIEXPORT void JNICALL
- Java_com_ywl532_jnithread_JniThread_normalThread(JNIEnv *env, jobject instance) {
- // TODO
- LOGD("normal thread");
- //创建线程
- pthread_create(&pthread, NULL, threadDoThings, NULL);
- }
#include <jni.h>
#include "AndroidLog.h"
#include "pthread.h"
pthread_t pthread;//线程对象
void *threadDoThings(void *data)
{
LOGD("jni thread do things");
pthread_exit(&pthread);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ywl532_jnithread_JniThread_normalThread(JNIEnv *env, jobject instance) {
// TODO
LOGD("normal thread");
//创建线程
pthread_create(&pthread, NULL, threadDoThings, NULL);
}
这就是一个最简单的创建线程的过程,代码不多,只用到了pthread_t和pthread_create两个对象和函数。下一篇将介绍线程锁的使用(生产者和消费者模型)。
源码下载:Github:Android-JniThread 欢迎star