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

  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 层的子线程创建)