NDK日志宏的简单写法
#include <android/log.h>
#define TAG "native_log"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG ,__VA_ARGS__)
JNI_OnLoad的使用
JNIEXPORT jint JNI_OnLoad(JavaVM* jvm,void *reserved){
if(NULL==gvm){
gvm = jvm;
}
//注意此处的返回值
return JNI_VERSION_1_4;
}
原生线程创建与合并
注意AS中native方法的返回值
原生线程的创建
pthread_t t;
int result = pthread_create(&t,NULL,doNativeThreadRun2,args);
//子线程需要执行的方法
static void* doNativeThreadRun2(void* args){
LOGE("resul4 %d",((WorkArgs*)args)->workId);
//子线程添加到jvm中
JNIEnv* env;
jint code = gvm->AttachCurrentThread(&env,NULL);
//解析线程参数
WorkArgs* workArgs = (WorkArgs*)args;
Java_com_canjun_ndkbeginer_MainActivity_nativeWorker(env,gObject,workArgs->workId,workArgs->iterationCount);
delete workArgs;
gvm->DetachCurrentThread();
int* result = (int*)malloc(sizeof(int));
*result = 1;
return result;
}
原生线程的合并
void * result = NULL;
if(0!=pthread_join(t,&result)){
throwEx(env,"unable to join thread");
return;
} else{
...
处理返回结果 result
}
原生线程同步
由于运行在相同的进程空间,线程共享内存和资源。这使得线程之间通讯和共享数据变得容易,但是有可能产生两种错误:由于并发修改共享资源产生线程干扰和内存不一致性,此时线程同步变得至关重要。线程同步机制确保这个并发的线程不同时执行代码的特定部分。
- 互斥锁同步
- 信号量同步
互斥锁同步
//创建同步锁
static pthread_mutex_t mutex;
if(0!=pthread_mutex_init(&mutex,NULL)){
throwEx(env,"unable to init mutex");
goto exit;
}
//加锁
if(0!=pthread_mutex_lock(&mutex)){
throwEx(env,"unable lock mutex");
goto exit;
}
//去锁
if(0!=pthread_mutex_unlock(&mutex)){
throwEx(env,"unable to unlock mutex");
goto exit;
}
//释放锁
if(0!=pthread_mutex_destroy(&mutex)){
throwEx(env,"unable to destroy mutex");
}
信号量同步
引入头文件
#include <semaphore.h>
//初始化信号量
if(0!=sem_init(&sem,2,2)){
throwEx(env,"unable to init sem");
goto exit;
}
//加信号量
if(0!=sem_wait(&sem)){
throwEx(env,"unable to init sem");
goto exit;
}
//去信号量
if(0!=sem_post(&sem)){
throwEx(env,"unable to init sem");
goto exit;
}
//释放信号量对象
if(0!=sem_destroy(&sem)){
throwEx(env,"unable to init sem");
goto exit;
}
原生线程优先级和调度策略
- 优先级
- 调度策略
调度策略
#include <sched.h>
1. 先进先出策略(SCHED_FIFO)
2. 循环轮训策略 (SCHED_RR)
使用方式一
//创建原生子线程时,在pthread_attr_t的thread_policy中指定
使用方式二
//在子线程调用时指定
pthread_setschedparams(ptread_t t,int policy s,struct schedparam const* params);