精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

研究了一下Android JNI,有幾個知識點不太懂

移動開發 Android
以前版本的Java線程不是OS線程,是JVM構造的用戶態線程(Green Thread),不能充分利用CPU,后期已經更改為使用OS線程實現。

[[437215]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人 。轉載本文請聯系程序喵大人公眾號。

Java線程與Native(OS)線程的區別

聯系:Java線程其實是一層OS線程的封裝,本質上就是OS線程。【以前版本的Java線程不是OS線程,是JVM構造的用戶態線程(Green Thread),不能充分利用CPU,后期已經更改為使用OS線程實現。】【參考https://mp.weixin.qq.com/s/Gxqnf5vjyaI8eSYejm7zeQ】

區別:

Java線程可以直接拿到JNIEnv,OS線程需要先attach到JVM,才可以拿到JNIEnv。【個人理解區別在于是否attach了JVM】

  1. jint AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args); 

Java線程可以FindClass成功,OS線程則FindClass失敗,原因是兩者的ClassLoader不同,OS線程AttachCurrentThread后持有的ClassLoader是系統的ClassLoader,如果想要FindClass成功,需要在JNI_Onload時獲取一份當前庫的ClassLoader保存起來,下次FindClass時使用此ClassLoader去操作。

  1. static jobject g_class_loader = NULL
  2. static jmethodID g_find_class_method = NULL
  3. void on_load() { 
  4.     JNIEnv *env = get_jni_env(); 
  5.     if (!env) { 
  6.         return
  7.     } 
  8.     jclass capture_class = (*env)->FindClass(env, "com/captureandroid/BMMCaptureEngine"); 
  9.     jclass class_class = (*env)->GetObjectClass(env, capture_class); 
  10.     jclass class_loader_class = (*env)->FindClass(env, "java/lang/ClassLoader"); 
  11.     jmethodID class_loader_mid = (*env)->GetMethodID(env, class_class, "getClassLoader""()Ljava/lang/ClassLoader;"); 
  12.     jobject local_class_loader = (*env)->CallObjectMethod(env, capture_class, class_loader_mid); 
  13.     g_class_loader = (*env)->NewGlobalRef(env, local_class_loader); 
  14.     g_find_class_method = 
  15.         (*env)->GetMethodID(env, class_loader_class, "findClass""(Ljava/lang/String;)Ljava/lang/Class;"); 
  16.  
  17. jclass find_class(const char *name) { 
  18.     JNIEnv *env = bmm_util_get_jni_env(); 
  19.     if (!env) { 
  20.         return NULL
  21.     } 
  22.     jclass ret = (*env)->FindClass(env, name); 
  23.     jthrowable exception = (*env)->ExceptionOccurred(env); 
  24.     if (exception) { 
  25.         (*env)->ExceptionClear(env); 
  26.         jstring name_str = (*env)->NewStringUTF(env, name); 
  27.         ret = (jclass)(*env)->CallObjectMethod(env, g_class_loader, g_find_class_method, name_str); 
  28.         (*env)->DeleteLocalRef(env, name_str); 
  29.     } 
  30.     return ret; 

JNI的作用

貼出別人翻譯的【官方文檔https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp16696】的一段話:

JNI最重要的設計目標就是在不同操作系統上的JVM之間提供二進制兼容,做到一個本地庫不需要重新編譯就可以運行不同的系統的JVM上面。為了達到這一點兒,JNI設計時不能關心JVM的內部實現,因為JVM的內部實現機制在不斷地變,而我們必須保持JNI接口的穩定。JNI的第二個設計目標就是高效。我們可能會看到,有時為了滿足第一個目標,可能需要犧牲一點兒效率,因此,我們需要在平臺無關和效率之間做一些選擇。最后,JNI必須是一個完整的體系。它必須提供足夠多的JVM功能讓本地程序完成一些有用的任務。JNI不能只針對一款特定的JVM,而是要提供一系列標準的接口讓程序員可以把他們的本地代碼庫加載到不同的JVM中去。有時,調用特定JVM下實現的接口可以提供效率,但更多的情況下,我們需要用更通用的接口來解決問題。

JNIEnv和JavaVM

就是個函數指針。

下圖是JNIEnv的指針結構:

JNIEnv其實是一個指向本地線程數據的接口指針,指針里面包含指向函數接口的指針,每一個接口函數在這表中都有一個預定義的偏移位置,類似C++虛函數表。

代碼如下:

  1. typedef const struct JNINativeInterface *JNIEnv;  
  2.  
  3. struct JNINativeInterface { 
  4.     void*       reserved0; 
  5.     void*       reserved1; 
  6.     void*       reserved2; 
  7.     void*       reserved3; 
  8.  
  9.     jint        (*GetVersion)(JNIEnv *); 
  10.  
  11.     jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*, 
  12.                         jsize); 
  13.     jclass      (*FindClass)(JNIEnv*, const char*); 
  14.     jobject     (*AllocObject)(JNIEnv*, jclass); 
  15.     jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...); 
  16.     jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list); 
  17.     jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, const jvalue*); 
  18.     ... 
  19. }; 
  20. JavaVM類似 
  21. struct JNIInvokeInterface { 
  22.     void*       reserved0; 
  23.     void*       reserved1; 
  24.     void*       reserved2; 
  25.  
  26.     jint        (*DestroyJavaVM)(JavaVM*); 
  27.     jint        (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*); 
  28.     jint        (*DetachCurrentThread)(JavaVM*); 
  29.     jint        (*GetEnv)(JavaVM*, void**, jint); 
  30.     jint        (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*); 
  31. }; 
  32.  
  33. typedef const struct JNIInvokeInterface* JavaVM; 

知識點1:為什么使用函數表而不是寫死某些函數項?

可將JNI命名空間與本地代碼分離,一個虛擬機可以提供多個版本的JNI函數表,用于不同場景。例如,虛擬機可支持兩種JNI函數表:

一個用于調試,做較多的錯誤檢查。

一個用于發布,做較少的錯誤檢查,更高效。

知識點2:JNIEnv是thread-local,只在當前線程有效,Native方法不能將JNIenv從當前線程傳遞到另一個線程。不能跨線程使用JNIEnv【至于JNIEnv為什么設計成thread-local,沒搞明白】。

知識點3:線程間雖然不共享JNIEnv,但是共享JavaVM,然后可以通過GetEnv獲取到當前線程的JNIEnv。

jint GetEnv(JavaVM *vm, void **env, jint version);

知識點4:Native方法接收JNI接口指針作為參數。虛擬機保證在同一個線程傳入Native方法的是相同的JNIEnv。如果不同線程調用Native方法,傳入他們的JNIEnv不同。但JNIEnv間接指向的函數表在多個線程間是共享的。

知識點5:為什么在C語言中調用Native方法需要將JNIEnv當作參數傳遞,而C++中卻不需要?

  1. // C語言 
  2. jstring model_path = (*env)->NewStringUTF(env, path); 
  3. // C++ 
  4. jstring model_path = env->NewStringUTF(path); 

前面列出的JNIEnv是C語言形式,Java還單獨為C++封裝了一層JNIEnv,簡化版代碼:

  1. struct _JNIEnv { 
  2.     /* do not rename this; it does not seem to be entirely opaque */ 
  3.     const struct JNINativeInterface* functions; 
  4.  
  5. #if defined(__cplusplus) 
  6.  
  7.     jint GetVersion() 
  8. return functions->GetVersion(this); } 
  9.  
  10.     jclass FindClass(const charname
  11. return functions->FindClass(this, name); } 
  12. #endif 

其實本質上還是調用的C語言那種形式的接口。

JNI中數據如何傳遞

這里不詳細介紹了,大體就是int,float這種基本類型采用拷貝,對象和byte數組等使用引用形式,所以其實Java層的byte字節流數據傳到Native層基本不耗時,不會發生拷貝【但是Native層如果想使用持有這塊數據,那就得自己拷貝一份了】。

還有些GlobalReference、LocalReference以及為什么要Delete LocalReference的這類知識點,這些比較基礎,就不介紹了,估計大家也都懂。

推薦閱讀

https://www.cnblogs.com/kexinxin/p/11689641.html

ndk官方文檔

https://developer.android.com/ndk/guides

參考資料

http://luori366.github.io/JNI_doc/jni_design_theory.html

https://www.cnblogs.com/kexinxin/p/11689641.html

 

https://developer.android.com/ndk/guides

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2020-03-27 08:43:20

Vueprops開發

2018-01-29 15:23:14

網絡知識點軟件測試

2012-04-23 15:49:04

2021-02-26 22:34:28

Webpack 前端項目

2021-08-11 08:16:02

springboot 動態注冊項目

2024-03-05 08:33:52

OptionsAPIcomuted

2009-04-01 11:39:39

視圖DB2

2010-08-30 19:42:45

DHCP服務器

2021-06-11 11:42:57

Swift 函數生成器結果生成器

2011-04-15 12:25:21

BGP路由

2010-08-17 14:56:00

HCNE認證

2016-05-30 17:31:34

Spring框架

2022-08-03 08:03:03

前端APIjavascript

2019-12-03 08:13:06

BDRDR路由器

2021-06-29 15:56:39

MYSQL開發數據庫

2021-06-17 06:51:32

Java泛型Java編程

2017-07-04 13:59:28

Android模塊化

2017-12-08 14:26:19

Android面試知識點總結

2020-04-15 11:21:49

QQ騰訊

2021-07-06 07:21:16

Spring 安全平臺
點贊
收藏

51CTO技術棧公眾號

欧亚一区二区| 蜜桃在线一区二区| 天天综合亚洲| 亚洲电影在线观看| 五月婷婷深爱五月| 日本中文字幕中出在线| 91论坛在线播放| 国产在线a不卡| 亚洲黄色小说图片| 91久久电影| 精品视频久久久久久| 天天影视色综合| 国产污视频在线播放| 国产精品久久二区二区| 超碰97网站| 免费看一级视频| 欧美日韩在线大尺度| 亚洲三级免费看| 亚洲色图欧美另类| 97久久精品一区二区三区的观看方式 | 男女性杂交内射妇女bbwxz| 欧美电影免费观看高清完整| 亚洲人吸女人奶水| 日韩资源av在线| 免费看日韩av| 国产精品白丝jk白祙喷水网站 | 一级片在线观看免费| 一区二区三区四区电影| 亚洲最大中文字幕| 成人午夜剧场视频网站| 国产精品色呦| 日韩免费福利电影在线观看| 亚洲精品手机在线观看| 欧美aa视频| 天天综合色天天综合色h| 午夜在线视频免费观看| 清纯唯美一区二区三区| 亚洲不卡视频在线观看| 亚洲黄色毛片| 欧美精品videosex牲欧美| 成人做爰视频网站| 色综合天天爱| 色妞欧美日韩在线| 免费观看特级毛片| 不卡在线一区| 最近2019年手机中文字幕| 极品人妻videosss人妻| 国产精品一区二区av日韩在线| 亚洲国产中文字幕在线观看| 免费黄色a级片| 中文字幕久久精品一区二区| 日韩午夜精品电影| aaaaa黄色片| 91蝌蚪精品视频| 欧美剧情电影在线观看完整版免费励志电影| 日本黄色三级大片| 性欧美freehd18| 精品视频全国免费看| 欧美三级午夜理伦三级富婆| 国产成人免费精品| 欧美日本韩国一区二区三区视频 | 国产一区二区在线观看视频| 91在线视频成人| 国产黄频在线观看| 丁香婷婷深情五月亚洲| 国产一区二区三区四区hd| 亚洲av成人无码网天堂| 国产欧美精品一区二区色综合 | 麻豆系列在线观看| 夜夜精品视频一区二区 | 日韩中文字幕一区| www在线免费观看视频| 亚洲线精品一区二区三区八戒| 很污的网站在线观看| 波多野结衣亚洲一二三| 欧美网站大全在线观看| 久久国产精品电影| 精品人妻一区二区三区香蕉| 国产探花在线精品一区二区| 爽爽爽爽爽爽爽成人免费观看| 三级全黄做爰视频| 激情欧美亚洲| 国产精品成熟老女人| 国产又粗又猛又爽又黄91| 福利一区福利二区| 日韩高清国产精品| 国产在线观看免费麻豆| 欧美日韩美女在线观看| 手机看片一级片| 国产精品毛片视频| 日韩中文字幕视频| 日本五十路女优| 免费精品视频在线| 国产精品国产三级国产专区53| 九色在线观看| 亚洲精品国产视频| 久久久久久久少妇| 91成人福利| 在线激情影院一区| 久久久夜色精品| 全部av―极品视觉盛宴亚洲| yellow视频在线观看一区二区 | 一本一道精品欧美中文字幕| 国产91精品免费| 亚洲一区二区三区在线观看视频| 91九色在线看| 3d动漫精品啪啪1区2区免费| 中文字幕影片免费在线观看| 久久久久久久久久久久久久| 日本精品一区二区三区在线| 国产高清在线观看视频| 国产女主播一区| 精品视频在线观看一区| 欧美在线在线| 中文字幕不卡av| 国产微拍精品一区| 国产成人精品免费网站| 天天成人综合网| 国产超碰精品| 亚洲精品一区二区网址 | 在线看国产一区二区| 亚洲欧美中文字幕在线一区| 超碰97在线资源站| 亚洲午夜电影| 亚洲自拍av在线| 黄色网址在线免费播放| 欧美色图一区二区三区| 一级黄色片大全| 99国产精品久久久久久久| 亚洲xxx自由成熟| 免费av不卡| 欧美午夜寂寞影院| 亚洲天堂岛国片| 视频一区欧美日韩| 蜜桃免费一区二区三区| 国产精品电影| 亚洲国产黄色片| 国产亚洲精品码| 国产成人在线视频免费播放| 午夜久久久久久久久久久| 国产精品久久乐| 在线视频欧美性高潮| 国产精品午夜一区二区| 国产偷国产偷亚洲高清人白洁 | 欧美专区福利免费| 亚洲乱码国产乱码精品精天堂 | 性欧美1819sex性高清大胸| 欧美精品99久久久**| 欧美激情精品久久久久久免费 | 亚洲激情婷婷| 国内外成人免费视频| brazzers在线观看| 亚洲国产高清福利视频| 特一级黄色大片| 久久只精品国产| av免费中文字幕| 久久99蜜桃| 国产精品爽爽爽| 免费网站免费进入在线| 91.com视频| 免费在线视频一区二区| 成人国产精品免费网站| 国产精品50p| 麻豆精品久久久久久久99蜜桃| 蜜臀av一区二区在线观看| 中文字幕一区二区三区四区五区六区| 亚洲青青久久| 欧美激情中文网| 亚洲av激情无码专区在线播放| 欧美日韩激情视频| 永久免费毛片在线观看| 激情综合色播激情啊| 国内自拍中文字幕| 欧美成人午夜77777| 国产成人精品av在线| 日本中文字幕电影在线免费观看| 欧美大片在线观看一区| 99热国产在线观看| 中文字幕永久在线不卡| 催眠调教后宫乱淫校园| 日韩电影一区二区三区| 欧美少妇一级片| 欧美天堂影院| 国产一区二区在线免费视频| 牛牛精品在线视频| 国产亚洲精品va在线观看| 国产视频aaa| 日韩欧美精品网址| 日本老熟俱乐部h0930| 91免费观看国产| 中文字幕55页| 99视频在线精品国自产拍免费观看| 日韩精品第一页| 亚洲一区二区电影| 国产精品中文字幕久久久| 免费在线看污片| 伊人久久男人天堂| 人妻中文字幕一区| 欧美日韩美少妇| 亚洲黄色激情视频| 亚洲图片激情小说| 久久久久久久毛片| 成人午夜在线视频| 乌克兰美女av| 亚洲欧美不卡| 天天做天天躁天天躁| 久久在线免费| 欧美中文娱乐网| 丁香综合av| 91麻豆桃色免费看| 韩日一区二区| 欧美中文字幕在线观看| 50度灰在线| 亚洲国产日本| 精品国产一区二区三区麻豆小说 | 一区二区免费电影| 日本欧美高清| 国产精品久久亚洲7777| 国产成人77亚洲精品www| 欧美重口另类videos人妖| bestiality新另类大全| 一区国产精品视频| 黄色视屏网站在线免费观看| 亚洲精品在线网站| 99视频国产精品免费观看a | 美女一区二区三区视频| 99在线精品免费视频九九视| 中文字幕精品在线播放| 日韩理论片av| 日韩欧美亚洲区| 蜜乳av综合| 美女被啪啪一区二区| 久久a爱视频| 国产精品久久亚洲7777| 日韩一区二区三区在线看| 91理论片午午论夜理片久久| 亚洲日韩中文字幕一区| 国产精品免费在线免费| 日韩成人影音| 国产精品免费一区豆花| www.久久.com| 日韩av免费看网站| 欧美18av| 国产精品一区二区电影| 国产69精品久久| 国产精品旅馆在线| av成人免费看| 国产中文字幕日韩| 99精品在线免费观看| 成人免费网站在线| 精品国产不卡一区二区| 97国产超碰| 精品精品精品| 免费av一区二区三区| 日韩有码av| 亚州欧美一区三区三区在线 | 亚洲色大成网站www| 久久亚洲欧美国产精品乐播| 成人免费av片| 国产午夜精品久久久久久久| 欧美午夜激情影院| 亚洲婷婷综合色高清在线| 91香蕉一区二区三区在线观看| 亚洲精品乱码久久久久久久久| 久久人人爽人人爽人人| 偷拍亚洲欧洲综合| 中文字幕第四页| 欧美在线免费播放| 国产精品久久无码一三区| 欧美成人性福生活免费看| 姝姝窝人体www聚色窝| 亚洲欧美日韩网| 日本免费视频在线观看| 欧美日韩国产成人高清视频| av中文字幕在线观看第一页| 奇米4444一区二区三区| 国产精品4hu.www| 成人av资源网| 国产一区二区三区日韩精品 | 欧美日韩国产天堂| 99久久夜色精品国产亚洲| 精品国产91亚洲一区二区三区婷婷| 天天操天天干天天舔| 最近免费中文字幕视频2019| 中文字幕资源网在线观看| 97精品在线视频| 成人午夜亚洲| 国产无套精品一区二区| 欧美亚洲在线日韩| 国产一区 在线播放| 久久久xxx| 韩国一区二区在线播放| 91污在线观看| 东方av正在进入| 欧美午夜精品久久久久久人妖| 一级特黄色大片| 亚洲精品福利在线| 超碰免费公开在线| 国产suv精品一区二区| 在线播放一区二区精品视频| 日本一区不卡| 亚洲精品九九| 91精产国品一二三产区别沈先生| 91碰在线视频| 欧美成人三级在线观看| 欧美午夜片在线观看| 色一情一乱一乱一区91av| 久久九九有精品国产23| 丝袜美腿一区| 国产欧美一区二区在线播放| 亚洲精品国产成人影院| 992kp快乐看片永久免费网址| 成人综合婷婷国产精品久久| 婷婷丁香综合网| 欧美日韩免费在线观看| 性做久久久久久久久久| 综合136福利视频在线| 新片速递亚洲合集欧美合集| 国产99在线免费| 国产视频福利在线| 亚洲国产又黄又爽女人高潮的| 污片视频在线免费观看| 国产日本欧美视频| 成人3d动漫在线观看| 欧美一级黄色片视频| 99久久精品免费精品国产| 朝桐光av在线| 日韩一二三区不卡| 浪潮av一区| 国产原创欧美精品| 久久精品国产99久久| 超碰在线97免费| 久久综合五月天婷婷伊人| av中文在线播放| 日韩av在线不卡| 理论不卡电影大全神| 国产精品一区二区三区在线 | 欧美精品videofree1080p| 电影一区中文字幕| 人人妻人人澡人人爽精品欧美一区| 日韩av在线播放中文字幕| 日本xxxxxxxxx18| 色综合久久99| 久草福利在线| 国产精品日本精品| 四虎成人av| 三日本三级少妇三级99| 亚洲免费视频中文字幕| 国产黄色免费大片| 欧美国产第一页| 精品国产导航| 国产中文字幕免费观看| 国产亚洲精品7777| 亚洲在线观看av| 成人黄色在线网站| 成年人网站在线观看视频| 7777女厕盗摄久久久| 黄色成人影院| 成人免费看片网址| 中文高清一区| www.久久av| 欧美网站一区二区| а√天堂官网中文在线| av噜噜色噜噜久久| 亚洲国产精品一区| 美女爆乳18禁www久久久久久| 日本久久一区二区三区| 在线免费av电影| 99国产在线观看| 亚洲欧美日本视频在线观看| 国产jjizz一区二区三区视频| 欧美群妇大交群中文字幕| 97影院秋霞午夜在线观看| 国产精品区免费视频| 久久精品人人| 久久嫩草捆绑紧缚| 欧美成人乱码一区二区三区| 理论片午夜视频在线观看| 日本中文不卡| 国产精品中文有码| av大片在线免费观看| 最新国产成人av网站网址麻豆| 日韩成人在线看| 波多野结衣作品集| 亚洲另类春色国产| 久久久久久久久亚洲精品| 国产欧美日韩中文| 夜久久久久久| 欧美壮男野外gaytube| 国产在线|日韩| www.日本少妇| 亚洲国产成人午夜在线一区| 粉嫩小泬无遮挡久久久久久| 日韩免费在线免费观看| 午夜精品久久99蜜桃的功能介绍| 永久免费看mv网站入口78| 91精品国产91综合久久蜜臀| a欧美人片人妖| av久久久久久| 亚洲国产精品传媒在线观看|