Android Studio NDK-POSIX線程

Android Studio NDK-POSIX線程
Android Studio NDK-POSIX線程

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虛擬機』再行.

  1. 係『NDK』原生代碼用POSIX線程, 加入『h』頭文檔聲明『POSIX Thread APIs』, 係『Android』實現係『Bionic API』庫
#include <pthread.h> // POSIX線程
#include <jni.h>
  1. 用pthread_create()創建線程
int pthread_create(pthread_t * thread,

pthread_attr_t const * attr,

void *(* start_routine)(void *),

void * arg);

  1. 參數
參數 簡介
thread 返回新建綫程句柄
attr 指定線程屬性,傅NULL使用默認值.
start_routine 指向綫程函式地址,
args 線程函式參數
  1. 返回值
0 線程啟動
Error code 錯誤碼
  1. 線程句柄
pthread_t      threadID;
  1. 線程函式參數,要全域變量,若傳多參數要『struct』蒞封裝.
typedef struct OPENGL_TYP{

JNIEnv *env;//   JNI

AAssetManager * aassetManager;// 資源管理

EGLDisplay display ;

EGLSurface surface;// 內核渲染表層

int Width, Height;// 熒屏寬高

}OPENGL,*OPENGL_PTR;

  1. 綫程函式樣板
void * start_rountine (void * args)
  1. 游戲運行綫程實例
void * run_game(void * param){

while (run == true)    {

Update_World();// 更新

Draw_World();// 繪畫

}

}

  1. 緩存JavaVM接口指針
jint JNI_OnLoad (JavaVM* vm, void* reserved){

javaVm = vm;

return JNI_VERSION_1_4;

}

  1. 將線程附著係JAVA虛擬機,獲得屬於本線程JNIEnv接口. 返回『零』成功,非『零』為錯誤碼
    if(javaVm->AttachCurrentThread(&env,NULL) == 0)
  1. 係JAVA虛擬機分離綫程.返回『零』成功,非『零』為錯誤碼
    if(javaVm->DetachCurrentThread() == 0)
  1. 啟動線程
 if( pthread_create(&threadID,  NULL, run_game, openGL) == 0)

return true;

else

return false;

  1. 游戲運行綫程
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()』死機. 暈得壹陣陣.

發表評論