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ネイティブの戻り値
ネイティブスレッドを作成します。
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
}
ネイティブスレッド同期
同じプロセス空間で実行されているので、メモリとスレッドのリソースを共有しました。これは、簡単にスレッド間のデータ通信および共有を行いますが、2エラーの可能性がありますため、共有リソースの同時変更に農産物ねじ干渉とメモリの矛盾に、この時間スレッドの同期が重要になります。スレッドの同期メカニズムは、同時実行スレッドが同時にコードの特定の部分を実行しないことを確実にします。
- ミューテックス同期
- セマフォ同期
ミューテックス同期
//创建同步锁
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);