美文网首页
NDK开发之Native 层的子线程创建

NDK开发之Native 层的子线程创建

作者: 呵呵_9e25 | 来源:发表于2019-05-16 17:39 被阅读0次
    1. 使用函数 pthread_create()函数来诞生Native层的子线程,具体代码如下:
    pthread_t thread; 
    void* trRun( void* ); 
    pthread_create( &thread, NULL, trRun, NULL);
    
    1. 因为在Native层产生的子线程是没有注册到VM虚拟机的,所以虚拟机没有为它生成一个JNIENV对象,那么就需要我们自己去要求VM生成了,实现代码如下:
    void* trRun( void* ) 
    { 
     int status; 
     JNIEnv *env; 
     bool isAttached = false; 
     
     Thread_sleep(1); 
     status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_4); 
     if(status < 0) { 
     LOGE("callback_handler: failed to get JNI environment, " 
     "assuming native thread"); 
     status = gJavaVM->AttachCurrentThread(&env, NULL); 
     if(status < 0) { 
     LOGE("callback_handler: failed to attach " 
     "current thread"); 
     return NULL; 
     } 
     isAttached = true; 
     } 
     callBack(env); 
     if(isAttached) 
     gJavaVM->DetachCurrentThread(); 
     return NULL; 
    }
    

    主要是通过这行代码status = gJavaVM->AttachCurrentThread(&env, NULL);,注册成功之后VM虚拟机会为我们返回一个JNIEnv 对象的引用,用完之后我们再通过gJavaVM->DetachCurrentThread();反注册释放这个对象引用。

    1. 多线程问题,如果有多个线程执行同一个函数就容易产生数据共享的混乱,我们可以通过以下代码解决:
    void callBack(JNIEnv *env){ 
    env->MonitorEnter(mSyncObj); 
     sum = 0; 
     for(int i = 0; i<=10; i++) 
     { 
     sum += i; 
     Thread_sleep(1); 
     } 
     //----------------------------------------------------------- 
     env->CallStaticVoidMethod(mClass, mid, sum, 666); 
     //----------------------------------------------------------- 
     env->MonitorExit(mSyncObj); 
    }
    

    主要就是通过一对函数调用来保证了线程的独立性,只有这个线程执行完了才会释放对应的对象锁,这对函数就是env->MonitorEnter(mSyncObj);env->MonitorExit(mSyncObj);

    当然对于互斥锁熟悉的同学也可以用pthread_mutex_t来实现同样的效果,它同样有一对函数
    pthread_mutex_lock( &g_mutex ) ;pthread_mutex_unlock( &g_mutex ) ;

    相关文章

      网友评论

          本文标题:NDK开发之Native 层的子线程创建

          本文链接:https://www.haomeiwen.com/subject/crfwaqtx.html