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