- 使用函数
pthread_create()
函数来诞生Native
层的子线程,具体代码如下:
pthread_t thread;
void* trRun( void* );
pthread_create( &thread, NULL, trRun, NULL);
- 因为在
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();
反注册释放这个对象引用。
- 多线程问题,如果有多个线程执行同一个函数就容易产生数据共享的混乱,我们可以通过以下代码解决:
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 ) ;
。