Android C++ 线程简介

我们都知道Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,POSIX线程库中有 一系列Pthreads API方便我们对Linux线程的操作。所以我们在Android中使用C/C++线程也就转到 了使用POSIX线程库。他们都在头文件“pthread.h”中。

创建子线程

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 会退出(挂掉)。

生产者和消费者模型

1、pthread_mutex_t :用于创建线程锁对象如:pthread_mutex_t mutex;

2、pthread_mutex_init :用于初始化pthread_mutex_t锁对象如: pthread_mutex_init(&mutex, NULL);

3、pthread_mutex_destroy :用于销毁pthread_mutex_t锁对象如: pthread_mutex_destroy(&mutex);

4、pthread_cond_t :用于创建线程条件对象如:pthread_cond_t cond;

5、pthread_cond_init :用于初始化pthread_cond_t条件对象如: pthread_cond_init(&cond, NULL);

6、pthread_cond_destroy :用于销毁pthread_cond_t条件对象如: pthread_cond_destroy(&cond); 7、pthread_mutex_lock :用于上锁mutex,本线程上锁后的其他变量是不能 被别的线程操作的如:pthread_mutex_lock(&mutex);

8、pthread_mutex_unlock :用于解锁mutex,解锁后的其他变量可以被其他线程操作 如:pthread_mutex_unlock(&mutex);

9、pthread_cond_signal :用于发出条件信号如:pthread_cond_signal(&mutex, &cond);

10、pthread_cond_wait :用于线程阻塞等待,直到pthread_cond_signal发出条件信号后 才执行退出线程阻塞执行后面的操作。

C++主线程调用Java方法

1、根据jobject获取jclass(静态方法就不用这一步了) 如:jclass clz = env->GetObjectClass(jobj);

2、获取jmethodid 如: jmethodid  jmid =         env->GetMethodID(clz, "onError", "(ILjava/lang/String;)V")

3、调用方法 如: jenv->CallVoidMethod(jobj, jmid, code, jmsg)

C++子线程调用Java方法

        由于JniEnv是线程相关的,所以子线程中不能使用创建线程的JniEnv;而 JVM是进程相关的,所以可以通过JVM来获取当前线程的JniEnv,然后就可以 调用Java的方法了。

1、获取JVM对象: JNI_OnLoad(JavaVM* vm,void* reserved)

2、通过JVM获取JniEnv:        

JNIEnv *env; jvm->AttachCurrentThread(&env, 0);        

/*     call Java Methoid         */        

jvm->DetachCurrentThread();

获取Java签名方法

1、签名方法参数类型对应表

【Android音视频开发】C++多线程/生产者消费者模型以及C++全局调用Java方法_子线程

 

2、通过命令获取native方法签名:

在native所在类的class文件目录下,执行命令:

javap -s ***.class

【Android音视频开发】C++多线程/生产者消费者模型以及C++全局调用Java方法_android_02