{"id":10991,"date":"2021-11-04T01:23:36","date_gmt":"2021-11-03T17:23:36","guid":{"rendered":"https:\/\/www.bookcard.net\/wordpress\/?p=10991"},"modified":"2021-11-04T01:31:51","modified_gmt":"2021-11-03T17:31:51","slug":"android_studio_ndk_posix_thread","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/android_studio_ndk_posix_thread\/","title":{"rendered":"Android Studio NDK-POSIX\u7dda\u7a0b"},"content":{"rendered":"<figure id=\"attachment_10992\" aria-describedby=\"caption-attachment-10992\" style=\"width: 1280px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2021\/11\/Android_Studio_NDK_POSIX_Thread.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10992\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2021\/11\/Android_Studio_NDK_POSIX_Thread.jpg\" alt=\"Android Studio NDK-POSIX\u7dda\u7a0b\" width=\"1280\" height=\"800\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2021\/11\/Android_Studio_NDK_POSIX_Thread.jpg 1280w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2021\/11\/Android_Studio_NDK_POSIX_Thread-300x188.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2021\/11\/Android_Studio_NDK_POSIX_Thread-768x480.jpg 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption id=\"caption-attachment-10992\" class=\"wp-caption-text\">Android Studio NDK-POSIX\u7dda\u7a0b<\/figcaption><\/figure>\n<p>Android_Studio_NDK_POSIX_Thread<\/p>\n<p>Android Studio NDK-POSIX\u7dda\u7a0b<\/p>\n<p>\u300eAndroid Studio NDK\u300f\u751f\u6210\u300eC\/C++\u300f\u7dda\u7a0b,\u4f7f\u7528 POSIX\u7dda\u7a0b\u7c21\u7a31\u300ePthreads\u300f. \u5112\u7565\u6b771995\u5e74\u767c\u5e03POSIX.1c\u300e\u6a19\u51c6\u300f\u300e\u64f4\u5c55\u300f\u7dab\u7a0b.\u70ba\u7dda\u7a0b\u5b9a\u7fa9\u300e\u5275\u5efa\u300f\u300e\u8655\u7406\u300fAPI.\u300eMicrsoft Windows\u300f\u300eMac OS X\u300f\u300eLinux\u300f\u519a\u8fac\u862d\u652f\u6301POSIX\u7dda\u7a0b.<\/p>\n<p>\u4e8b\u56e0\u300ePOSIX\u7dda\u7a0b\u300f\u5514\u5c6c\u4e8e\u300eJAVA\u300f\u5e73\u81fa, \u5c0e\u81f4\u300eJAVA\u865b\u64ec\u6a5f\u300f\u5187\u767c\u8b58\u5225\u300ePOSIX\u7dda\u7a0b\u300f, \u00a0\u70ba\u5497\u8a2a\u554f\u300eJAVA\u865b\u64ec\u6a5f\u300f,\u300ePOSIX\u7dda\u7a0b\u300f\u7dda\u7a0b\u5148\u9644\u4fc2\u300eJAVA\u865b\u64ec\u6a5f\u300f\u518d\u884c.<\/p>\n<ol>\n<li>\u4fc2\u300eNDK\u300f\u539f\u751f\u4ee3\u78bc\u7528POSIX\u7dda\u7a0b, \u52a0\u5165\u300eh\u300f\u982d\u6587\u6a94\u8072\u660e\u300ePOSIX Thread APIs\u300f, \u4fc2\u300eAndroid\u300f\u5be6\u73fe\u4fc2\u300eBionic API\u300f\u5eab<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">#include &lt;pthread.h&gt; \/\/ POSIX\u7dda\u7a0b<\/td>\n<\/tr>\n<tr>\n<td width=\"575\">#include &lt;jni.h&gt;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"2\">\n<li>\u7528pthread_create()\u5275\u5efa\u7dda\u7a0b<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">int pthread_create(pthread_t * thread,<\/p>\n<p>pthread_attr_t const * attr,<\/p>\n<p>void *(* start_routine)(void *),<\/p>\n<p>void * arg);<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"3\">\n<li>\u53c3\u6578<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"151\">\u53c3\u6578<\/td>\n<td width=\"424\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">thread<\/td>\n<td width=\"424\">\u8fd4\u56de\u65b0\u5efa\u7dab\u7a0b\u53e5\u67c4<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">attr<\/td>\n<td width=\"424\">\u6307\u5b9a\u7dda\u7a0b\u5c6c\u6027,\u5085NULL\u4f7f\u7528\u9ed8\u8a8d\u503c.<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">start_routine<\/td>\n<td width=\"424\">\u6307\u5411\u7dab\u7a0b\u51fd\u5f0f\u5730\u5740,<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">args<\/td>\n<td width=\"424\">\u7dda\u7a0b\u51fd\u5f0f\u53c3\u6578<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"4\">\n<li>\u8fd4\u56de\u503c<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"288\">0<\/td>\n<td width=\"288\">\u7dda\u7a0b\u555f\u52d5<\/td>\n<\/tr>\n<tr>\n<td width=\"288\">Error code<\/td>\n<td width=\"288\">\u932f\u8aa4\u78bc<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"5\">\n<li>\u7dda\u7a0b\u53e5\u67c4<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">pthread_t\u00a0\u00a0\u00a0\u00a0\u00a0 threadID;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"6\">\n<li>\u7dda\u7a0b\u51fd\u5f0f\u53c3\u6578,\u8981\u5168\u57df\u8b8a\u91cf,\u82e5\u50b3\u591a\u53c3\u6578\u8981\u300estruct\u300f\u849e\u5c01\u88dd.<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">typedef struct OPENGL_TYP{<\/p>\n<p>JNIEnv *env;\/\/\u00a0 \u00a0JNI<\/p>\n<p>AAssetManager * aassetManager;\/\/ \u8cc7\u6e90\u7ba1\u7406<\/p>\n<p>EGLDisplay display ;<\/p>\n<p>EGLSurface surface;\/\/ \u5167\u6838\u6e32\u67d3\u8868\u5c64<\/p>\n<p>int Width, Height;\/\/ \u7192\u5c4f\u5bec\u9ad8<\/p>\n<p>}OPENGL,*OPENGL_PTR;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"7\">\n<li>\u7dab\u7a0b\u51fd\u5f0f\u6a23\u677f<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">void * start_rountine (void * args)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"8\">\n<li>\u6e38\u6232\u904b\u884c\u7dab\u7a0b\u5be6\u4f8b<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">void * run_game(void * param){<\/p>\n<p>while (run == true)\u00a0\u00a0\u00a0 {<\/p>\n<p>Update_World();\/\/ \u66f4\u65b0<\/p>\n<p>Draw_World();\/\/ \u7e6a\u756b<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"9\">\n<li>\u7de9\u5b58JavaVM\u63a5\u53e3\u6307\u91dd<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">jint JNI_OnLoad (JavaVM* vm, void* reserved){<\/p>\n<p>javaVm = vm;<\/p>\n<p>return JNI_VERSION_1_4;<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"10\">\n<li>\u5c07\u7dda\u7a0b\u9644\u8457\u4fc2JAVA\u865b\u64ec\u6a5f,\u7372\u5f97\u5c6c\u65bc\u672c\u7dda\u7a0bJNIEnv\u63a5\u53e3. \u8fd4\u56de\u300e\u96f6\u300f\u6210\u529f,\u975e\u300e\u96f6\u300f\u70ba\u932f\u8aa4\u78bc<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">\u00a0\u00a0\u00a0 if(javaVm-&gt;AttachCurrentThread(&amp;env,NULL) == 0)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"11\">\n<li>\u4fc2JAVA\u865b\u64ec\u6a5f\u5206\u96e2\u7dab\u7a0b.\u8fd4\u56de\u300e\u96f6\u300f\u6210\u529f,\u975e\u300e\u96f6\u300f\u70ba\u932f\u8aa4\u78bc<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">\u00a0\u00a0\u00a0 if(javaVm-&gt;DetachCurrentThread() == 0)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"12\">\n<li>\u555f\u52d5\u7dda\u7a0b<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">\u00a0if( pthread_create(&amp;threadID,\u00a0 NULL, run_game, openGL) == 0)<\/p>\n<p>return true;<\/p>\n<p>else<\/p>\n<p>return false;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol start=\"13\">\n<li>\u6e38\u6232\u904b\u884c\u7dab\u7a0b<\/li>\n<\/ol>\n<table>\n<tbody>\n<tr>\n<td width=\"575\">void * run_game(void * param){<\/p>\n<p>\/\/ \u5c07\u7dda\u7a0b\u9644\u8457\u4fc2JAVA\u865b\u64ec\u6a5f,<\/p>\n<p>if(javaVm-&gt;AttachCurrentThread(&amp;env,NULL) != 0)<\/p>\n<p>return NULL;<\/p>\n<p>Init_Engine( ); \/\/ \u521d\u6b64\u5f15\u64ce<\/p>\n<p>Init_World( );\u00a0 \/\/ \u521d\u6b64\u6e38\u6232\u4e16\u754c<\/p>\n<p>while (run == true)\u00a0\u00a0\u00a0 {<\/p>\n<p>Update_World();\/\/ \u66f4\u65b0<\/p>\n<p>Draw_World();\/\/ \u7e6a\u756b<\/p>\n<p>}<\/p>\n<p>Shutdown_World();\/\/ \u9582\u6e38\u6232\u4e16\u754c<\/p>\n<p>Shutdown_Engine();\u00a0 \/\/ \u9582\u5f15\u64ce<\/p>\n<p>\/\/ \u4fc2JAVA\u865b\u64ec\u6a5f\u5206\u96e2\u7dab\u7a0b<\/p>\n<p>javaVm-&gt;DetachCurrentThread();<\/p>\n<p>return NULL;<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e4b\u524d\u4fc2\u300eJAVA Thread\u300f\u884c\u300eANativeWindow_fromSurface()\u300f\u5187\u4e8b,\u4fc2\u300eC\/C++ Thread\u300f\u884c\u300eANativeWindow_fromSurface()\u300f\u6b7b\u6a5f. \u6688\u5f97\u58f9\u9663\u9663.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android_Studio_NDK_POSIX_Thread Android Studio NDK-POSI &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/android_studio_ndk_posix_thread\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">Android Studio NDK-POSIX\u7dda\u7a0b<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[2],"class_list":["post-10991","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","entry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/10991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/comments?post=10991"}],"version-history":[{"count":2,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/10991\/revisions"}],"predecessor-version":[{"id":10995,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/10991\/revisions\/10995"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=10991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=10991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=10991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}