Android NDK c建立新的線程

在jni的c/c++層建立一個新的線程只須要3步:java

1.導入庫c++

#include<pthread.h>ide

2.寫好線程要作的事spa

void* run_1(void*);線程

void* run_1(void* args){翻譯

...指針

}orm

3.調用方法接口

pthread_t thread_1;ci

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估計就默認分配了)
 

例子代碼見原帖.

相關文章
相關標籤/搜索