Android_Studio_NDK_POSIX_Thread
Android Studio NDK-POSIX線程
『Android Studio NDK』生成『C/C++』線程,使用 POSIX線程簡稱『Pthreads』. 儒略歷1995年發布POSIX.1c『標准』『擴展』綫程.為線程定義『創建』『處理』API.『Micrsoft Windows』『Mac OS X』『Linux』冚辬蘭支持POSIX線程.
事因『POSIX線程』唔屬于『JAVA』平臺, 導致『JAVA虛擬機』冇發識別『POSIX線程』, 為咗訪問『JAVA虛擬機』,『POSIX線程』線程先附係『JAVA虛擬機』再行.
- 係『NDK』原生代碼用POSIX線程, 加入『h』頭文檔聲明『POSIX Thread APIs』, 係『Android』實現係『Bionic API』庫
#include <pthread.h> // POSIX線程 |
#include <jni.h> |
- 用pthread_create()創建線程
int pthread_create(pthread_t * thread,
pthread_attr_t const * attr, void *(* start_routine)(void *), void * arg); |
- 參數
參數 | 簡介 |
thread | 返回新建綫程句柄 |
attr | 指定線程屬性,傅NULL使用默認值. |
start_routine | 指向綫程函式地址, |
args | 線程函式參數 |
- 返回值
0 | 線程啟動 |
Error code | 錯誤碼 |
- 線程句柄
pthread_t threadID; |
- 線程函式參數,要全域變量,若傳多參數要『struct』蒞封裝.
typedef struct OPENGL_TYP{
JNIEnv *env;// JNI AAssetManager * aassetManager;// 資源管理 EGLDisplay display ; EGLSurface surface;// 內核渲染表層 int Width, Height;// 熒屏寬高 }OPENGL,*OPENGL_PTR; |
- 綫程函式樣板
void * start_rountine (void * args) |
- 游戲運行綫程實例
void * run_game(void * param){
while (run == true) { Update_World();// 更新 Draw_World();// 繪畫 } } |
- 緩存JavaVM接口指針
jint JNI_OnLoad (JavaVM* vm, void* reserved){
javaVm = vm; return JNI_VERSION_1_4; } |
- 將線程附著係JAVA虛擬機,獲得屬於本線程JNIEnv接口. 返回『零』成功,非『零』為錯誤碼
if(javaVm->AttachCurrentThread(&env,NULL) == 0) |
- 係JAVA虛擬機分離綫程.返回『零』成功,非『零』為錯誤碼
if(javaVm->DetachCurrentThread() == 0) |
- 啟動線程
if( pthread_create(&threadID, NULL, run_game, openGL) == 0)
return true; else return false; |
- 游戲運行綫程
void * run_game(void * param){
// 將線程附著係JAVA虛擬機, if(javaVm->AttachCurrentThread(&env,NULL) != 0) return NULL; Init_Engine( ); // 初此引擎 Init_World( ); // 初此游戲世界 while (run == true) { Update_World();// 更新 Draw_World();// 繪畫 } Shutdown_World();// 閂游戲世界 Shutdown_Engine(); // 閂引擎 // 係JAVA虛擬機分離綫程 javaVm->DetachCurrentThread(); return NULL; } |
之前係『JAVA Thread』行『ANativeWindow_fromSurface()』冇事,係『C/C++ Thread』行『ANativeWindow_fromSurface()』死機. 暈得壹陣陣.