1. 程式人生 > >Android NDK c建立新的執行緒

Android NDK c建立新的執行緒

在jni的c/c++層建立一個新的執行緒只需要3步:

1.匯入庫

#include<pthread.h>

2.寫好執行緒要做的事

void* run_1(void*);

void* run_1(void* args){

...

}

3.呼叫方法

pthread_t thread_1;

pthread_create(&thread_1,NULL,run_1,args);

///////////////////////////////////////////////////////////////////////////////////

但是這樣的執行緒,缺少了JNIEnv指標,好像幹不了什麼事,所以就要做這個基礎上,得到JNIEnv指標,並將該執行緒依附於java虛擬機器之上,這樣這個執行緒像java層過來的執行緒一樣,能夠幹很多事情。

官方文件關於attachCurrentThread()的說明,好像勉強看得懂,就翻譯一下試試。。。

The JNI interface pointer (JNIEnv) is valid only in the current thread. Should another thread need to access the Java VM, it must first call AttachCurrentThread() to attach itself to the VM and obtain a JNI interface pointer. Once attached to the VM, a native thread works just like an ordinary Java thread running inside a native method. The native thread remains attached to the VM until it calls DetachCurrentThread() to detach itself.

The attached thread should have enough stack space to perform a reasonable amount of work. The allocation of stack space per thread is operating system-specific. For example, using pthreads, the stack size can be specified in thepthread_attr_t argument to pthread_create.

JNI介面的JNIEnv指標只是在當前執行緒是有效的(意思是不同的執行緒不能共用一個JNIEnv*)。其他的執行緒要訪問虛擬機器的時候,他就必須通過呼叫AttachCurrentThread()方法來讓當前執行緒與虛擬機器建立某種關係,然後得到一個指標,也就是JNIEnv*。這個執行緒一旦與了虛擬機器建立了某種關係,這個本地(由c/c++程式碼建立)的執行緒就能夠像一個通常的java執行緒一樣在c/c++層執行了。這種關係一直保持著,直到他呼叫了DetachCurrentThread()方法來解除關係。
這個與vm保持著某種關係的執行緒必須要保證有足夠的棧空間來執行各種工作。每個執行緒所能分配的棧空間大小是有明確規定的。舉個例子,使用了pthreads,棧的大小就應該是在pthread_create方法呼叫時傳入的pthread_attr_t引數(第二個引數)的大小之內。(這裡正好說明了以上方法的第二個引數是幹嘛的,null估計就預設分配了)
 

例子程式碼見原帖.