亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

NDK學習( 三),多線程與異步回調

2019-11-06 09:55:16
字體:
來源:轉載
供稿:網友
場景:在java中傳遞任意類型參數,在JNI中新開子線程,將傳入的參數處理后回調Java中的方法技術點:1、在JNI中新開子線程并傳遞參數2、在子線程中回調Java方法(誤區:JNIEnv指針可以共享)對于技術點1,可參考一般的C++開發教程,一般創建子線程的方法有:通過pthread_createC++11中thread的用法參考:http://stackoverflow.com/questions/23872663/how-to-start-a-new-thread-from-jni另外要注意的是傳遞的參數應當是堆內存中的指針,或者是全局變量,對于局部變量,可能在子線程中調用時已經失效。對于技術點2,需要注意的是JNIEnv *這類指針是無法在線程間共享的,參考JNI文檔。參考:http://stackoverflow.com/questions/13383823/native-multithreading-and-jni步驟:在JNI_OnLoad或者Java調用的native方法中緩存JavaVM*,JavaVM*指針是唯一在線程間可以共享的。在子線程的native方法中調用AttachCurrentThread ,獲取JNIEnv*指針。通過JavaVM*和JNIEnv*找到你需要的jclasses,jobjects,jmethodIDs,它們不能在線程間共享。如果需要,將jclasses,jobjects轉換為全局變量,jmethodIDs不需要轉換,因為它不是對象。在JNI_OnUnlaod時刪除全局變量這類引用,當你不再需要時。理解JNI_OnLoad、JNI_OnUnload參考:http://docs.Oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html#JNI_OnLoad當native lib被加載(如System.loadLibrary()執行后),虛擬機會執行JNI_OnLoad,該方法必須返回當前JNI版本號。如果native lib不exportJNI_OnLoad方法,虛擬機認為lib只需要JNI_VERSION_1_1.如果返回的版本號不能被識別,該lib將不能被加載。當包含native lib的類加載器被垃圾回收器回收,JNI_OnUnload會被調用。該方法可用來清理不再需要的指針。Java代碼:public native void asyncCallBack(String str);//執行后向native lib傳入字符串native代碼:extern "C" {JavaVM* javaVM; //定義要全局共享的虛擬機指針jobject jinstance; //定義要共享的Java對象JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved){javaVM = jvm; //將全局虛擬機指針賦值JNIEnv* env = NULL;jint result = -1;//獲取JNI版本if (jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK){LOGE("GetEnv failed!");return result;}LOGE("JNI_VERSION:%d",JNI_VERSION_1_4);return JNI_VERSION_1_4;}//線程函數void* runAsync(void* args) {const char* chars = (const char*) args;JNIEnv *env = NULL;//Attach主線程if (javaVM->AttachCurrentThread(&env, NULL) != JNI_OK) {LOGE("%s: AttachCurrentThread() failed", __FUNCTION__);return NULL;}if (env != NULL) {LOGE("jnienv* obtained");}else {return NULL;}LOGE("runAsync chars:%s", chars);jclass jclass1 = env->GetObjectClass(jinstance);if(jclass1==NULL){LOGE("sub thread : failed get class");return NULL;}else{LOGE("sub thread : find class");}jmethodID jmethodID =env->GetMethodID(jclass1,"callback","(Ljava/lang/String;)V");if(jmethodID==NULL){LOGE("sub thread : failed get jmethodID");return NULL;}else{LOGE("sub thread : find jmethodID");}string str =chars;string str2 = " from native";str.append(str2);jstring jstr=env->NewStringUTF(str.c_str());env->CallVoidMethod(jinstance,jmethodID,jstr);env->DeleteGlobalRef(jinstance);//刪除全局引用if(javaVM!=NULL){javaVM=NULL;LOGE("release JavaVM*");}if(jinstance!=NULL){jinstance=NULL;LOGE("release jinstance*");}LOGE("sub thread:task finish");}JNIEXPORT void JNICALLJava_dev_mars_jnidemo_NativeThread_asyncCallBack(JNIEnv *env, jobject instance,jstring jstr) {const char* chars = env->GetStringUTFChars(jstr,0);LOGE("Java_dev_mars_jnidemo_NativeThread_asyncCallBack pass parameter:%s",chars);//將jobject轉換為全局變量,因為jclass、jobject也不能在線程間共享jinstance = env->NewGlobalRef(instance);pthread_t thread_1;pthread_create(&thread_1,NULL,runAsync,(void*)chars);}}小結:jobject、jclass、jmethodID這些類型無法在線程間共享,需要轉換為全局變量。本例中在JNI接口線程中將jobject轉換為全局變量,在子線程通過JavaVM*獲取JNIEnv*,并通過全局變量jobect獲取jclass,從而得到jmethod。native調用java方法的函數主要有三種:參考:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16656NativeType Call<type>Method(JNIEnv *env, jobject obj,jmethodID methodID, ...);NativeType Call<type>MethodA(JNIEnv *env, jobject obj,jmethodID methodID, const jvalue *args);NativeType Call<type>MethodV(JNIEnv *env, jobject obj,jmethodID methodID, va_list args);通過觀察發現,Method、MethodA、MethodV所帶的參數類型不同,其中<type>是回調的返回類型。創建jobject的全局引用通過 env->NewGlobalRef(instance);回調完釋放全局引用通過JNIEnv*的 env->DeleteGlobalRef(jinstance);參考:http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/sync.html如本文有任何問題歡迎指出,謝謝
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩精品视频| 国产成人精品午夜| 97在线观看视频| 色噜噜狠狠狠综合曰曰曰88av| 在线看福利67194| 亚洲精品电影网| 欧美成人精品h版在线观看| 在线看欧美日韩| 成人激情视频网| 亚洲的天堂在线中文字幕| 精品国产依人香蕉在线精品| 国产精品久久久久久久午夜| 亚洲欧洲偷拍精品| 狠狠色噜噜狠狠狠狠97| 国产亚洲成精品久久| 在线观看精品自拍私拍| 青草青草久热精品视频在线观看| 国产精品第2页| 久久免费在线观看| 国产精品久久久av久久久| 欧美日韩国产一中文字不卡| 一区二区三区视频免费| 欧美日韩aaaa| 日韩免费精品视频| 日韩精品在线电影| 日韩欧美视频一区二区三区| 91精品国产色综合久久不卡98口| 久久久久北条麻妃免费看| 久久久久久网址| 欧美日韩国产综合视频在线观看中文| 国产精品视频免费在线观看| 国产成人综合亚洲| 丁香五六月婷婷久久激情| 国产啪精品视频网站| 亚洲第一区在线观看| 97精品国产aⅴ7777| 91精品国产自产在线观看永久| 国内偷自视频区视频综合| 国产精品久久久久久久久久久新郎| 夜色77av精品影院| 九九九热精品免费视频观看网站| 91国产精品91| 日韩在线免费视频观看| 91九色视频在线| 红桃av永久久久| 欧美激情乱人伦一区| 精品欧美aⅴ在线网站| 欧美巨乳美女视频| 欧美裸体xxxx极品少妇| 中文字幕最新精品| 色多多国产成人永久免费网站| 欧美激情亚洲综合一区| 国产精品综合不卡av| 国产成人综合精品在线| 久久人人爽国产| 国产亚洲a∨片在线观看| 国产精欧美一区二区三区| 日韩毛片在线观看| 欧美成人精品一区二区三区| 国产91精品久久久久久| 日韩视频免费在线观看| 中文字幕一精品亚洲无线一区| 国产在线观看精品一区二区三区| 欧美黑人一级爽快片淫片高清| 亚洲色无码播放| 久久久久久久影院| 精品久久久国产精品999| 欧美华人在线视频| 2019中文字幕在线| 在线观看欧美日韩国产| 日韩中文理论片| 国产69久久精品成人看| 亚洲aⅴ男人的天堂在线观看| 久久久久久免费精品| 欧美性猛交xxxx乱大交3| 国产午夜精品视频免费不卡69堂| 美女久久久久久久| 色www亚洲国产张柏芝| 欧美精品一区二区三区国产精品| 欧美一级淫片videoshd| 国产视频丨精品|在线观看| 午夜精品蜜臀一区二区三区免费| 在线观看日韩视频| 精品高清一区二区三区| 亚洲久久久久久久久久| 81精品国产乱码久久久久久| 69av在线播放| 91精品视频观看| 尤物99国产成人精品视频| 欧美日韩激情网| 欧美日韩一区免费| 久久99热这里只有精品国产| 精品成人av一区| 欧美俄罗斯乱妇| 伦伦影院午夜日韩欧美限制| 国产精品永久免费观看| 日韩av理论片| 日韩欧美高清在线视频| 一本一本久久a久久精品综合小说| 久久91超碰青草是什么| 久久资源免费视频| 欧美激情久久久久久| 韩剧1988在线观看免费完整版| 欧美国产视频一区二区| 日韩视频在线观看免费| 欧美激情videoshd| 欧美自拍视频在线| 九九九热精品免费视频观看网站| 欧亚精品中文字幕| 亚洲视频一区二区三区| 日韩av电影手机在线| 亚洲色图第一页| 中文字幕在线日韩| 久久久999精品视频| 精品久久久91| 久久久久久12| 久久久久久久av| 日本成人激情视频| 亚洲一区国产精品| 欧美疯狂做受xxxx高潮| 久久亚洲精品小早川怜子66| 国产成人精品综合久久久| 国产成人精品在线| 亚洲午夜久久久久久久| 国产女人18毛片水18精品| 国产精品69av| 91精品国产91久久久久福利| 亚洲综合av影视| 中文字幕精品一区久久久久| 亚洲人成在线电影| 亚洲激情视频在线| 夜夜躁日日躁狠狠久久88av| 欧美日韩成人黄色| 久久久久久69| 色综合天天狠天天透天天伊人| 夜夜嗨av色综合久久久综合网| 久久福利视频网| 国产亚洲精品美女久久久久| 国产精品成人av性教育| 欧美性xxxxhd| 欧美日韩国产综合视频在线观看中文| 亚洲第一精品夜夜躁人人躁| 日韩在线播放视频| 国产香蕉一区二区三区在线视频| 国产精品嫩草影院久久久| 日韩精品免费一线在线观看| 这里精品视频免费| 国产欧美日韩精品丝袜高跟鞋| 夜夜狂射影院欧美极品| 亚洲精品xxx| 久久久999国产精品| 亚洲片国产一区一级在线观看| 51色欧美片视频在线观看| 日韩毛片中文字幕| 久久久久久中文字幕| 国产精品男人爽免费视频1| 国内外成人免费激情在线视频网站| 国产啪精品视频网站| 黑人狂躁日本妞一区二区三区| 亚洲成人久久电影| 精品久久久久久久久久久久久| 懂色av影视一区二区三区| 美女福利精品视频| 久久免费在线观看|