ネイティブスレッドのNDKを使用。

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);
公開された98元の記事 ウォンの賞賛6 ビュー20000 +

おすすめ

転載: blog.csdn.net/dirksmaller/article/details/103789409