精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品在线小视频| www.日韩大片| 爽爽爽爽爽爽爽成人免费观看| 在线视频亚洲自拍| 中文字幕第31页| 日韩黄色大片| 日韩视频一区在线观看| 欧美黑人在线观看| 亚洲色图另类小说| 日韩国产欧美在线播放| 亚洲第一福利网站| 国产精品亚洲a| 麻豆传媒在线完整视频| 美女国产一区| 久久香蕉频线观| xxxwww国产| 国产第一亚洲| 99re这里只有精品首页| 国产国语刺激对白av不卡| 欧美手机在线观看| 亚洲人成亚洲精品| 91精品黄色片免费大全| 男人添女荫道口图片| a√在线中文网新版址在线| 国产精品一区二区你懂的| 日韩中文字幕在线| 成年人小视频在线观看| 99re久久| 欧美a级一区| 欧美黑人猛猛猛| 午夜精品久久久99热福利| 国产成人在线视频网站| 黄色污污视频在线观看| 久久久久成人精品无码中文字幕| 日韩成人激情视频| 亚洲在线视频一区| 国产aaa精品| 欧美三级免费看| 国产日韩欧美一区二区三区| 亚洲午夜一区二区三区| 亚洲午夜一二三区视频| 麻豆国产精品777777在线| 亚洲成人久久一区| 手机看片一级片| 日本视频在线免费| 天天综合网久久| 午夜小视频在线播放| 91不卡在线观看| 国产精品网站导航| 国产精品亚洲二区| 成人av一区二区三区在线观看| 国产精品自在线| 精品国内自产拍在线观看| 三日本三级少妇三级99| 青青青免费在线视频| 日韩美女久久久| 欧美日韩国产高清一区二区三区 | 中文字幕在线中文字幕在线中三区| 国产精品1区二区.| 2019中文字幕在线| 男人天堂av电影| 国产精品qvod| 欧美综合在线视频| 国产麻花豆剧传媒精品mv在线| jizz亚洲| 日本一区二区在线不卡| 欧美不卡福利| 你懂的在线看| 国产一本一道久久香蕉| 国产精品视频久久久| 精品国产午夜福利| 亚洲色图二区| 久久视频在线直播| 欧美视频www| 91国语精品自产拍| 日韩视频免费在线观看| 精品无码久久久久成人漫画 | 成人免费视频网站入口| 国产女人高潮毛片| 校园春色综合网| 911国产网站尤物在线观看| 久久综合综合久久| 亚洲二区视频| 欧美专区在线播放| 黄色片视频免费| 老牛国产精品一区的观看方式| 久久精品国产久精国产思思| 一级黄色片日本| 一区二区中文| 欧美精品福利视频| 青青草免费观看视频| 天堂资源在线中文精品| 国产精品午夜视频| 国产毛片一区二区三区va在线| 国产日韩欧美在线播放不卡| 欧美一级视频一区二区| 无码人妻丰满熟妇精品| 亚洲免费网址| 国产精品久久久久久久久久小说| 久草视频免费在线| 欧美另类视频| 777午夜精品福利在线观看| 激情五月激情综合| 911久久香蕉国产线看观看| 日韩视频精品在线| 欧美日韩国产一二三区| 欧美一区成人| 欧美性视频精品| 91在线视频国产| 日本不卡视频在线| 亲爱的老师9免费观看全集电视剧| 青娱乐国产盛宴| 亚洲欧美成人| 91青草视频久久| 婷婷丁香一区二区三区| 中文字幕精品在线不卡| 日本一区二区在线| 在线黄色网页| 色先锋久久av资源部| 在线免费看v片| 美国成人xxx| 亚洲激情小视频| 黑人と日本人の交わりビデオ| 狼人天天伊人久久| 色偷偷亚洲男人天堂| 久久久久亚洲天堂| 蜜臀a∨国产成人精品| 亚洲精品日韩av| 日韩一级免费毛片| 久久精品人人做人人爽97| 亚洲精品日韩精品| av日韩中文| 911精品产国品一二三产区| 欧美成人午夜精品免费| 欧美69视频| 人妖精品videosex性欧美| av综合在线观看| 国产欧美精品日韩区二区麻豆天美| 日本成人黄色免费看| 国产原厂视频在线观看| 调教+趴+乳夹+国产+精品| 搡的我好爽在线观看免费视频| 日本一区影院| 中文字幕日本欧美| 中文字幕高清在线免费播放| 国产成人精品一区二 | 欧美一级大黄| 亚洲国产精品成人精品| 国产稀缺精品盗摄盗拍| 日韩电影一区二区三区| 国产一区二区在线观看免费播放| 无码国产伦一区二区三区视频| 久久综合九色综合欧美就去吻| 色阁综合av| 日韩大尺度黄色| 日韩成人av网| 黄色一级片免费看| 成人小视频免费在线观看| 男女啪啪的视频| 日韩伦理一区二区| 亚洲色图17p| 国产女主播喷水视频在线观看| 捆绑调教一区二区三区| 日韩福利在线| 日本久久免费| 亚洲视频在线免费观看| 中文字幕高清在线免费播放| 久久午夜国产精品| 欧美日韩第二页| 最新国产一区| 国产成人久久精品| aaa在线观看| 欧美美女黄视频| 久久久久9999| 亚洲人成免费| 免费日韩av电影| 免费电影日韩网站| 亚洲一区二区精品| 在线观看黄色网| 中文字幕一区av| 特级西西444www| 欧美日韩一区二区三区四区在线观看 | 久久精品这里热有精品| 一级黄色片免费看| 亚洲日本青草视频在线怡红院| 97在线播放视频| 国产精品一区二区三区av麻| 国产精品免费电影| 国产黄色在线观看| 欧美色国产精品| 亚洲天堂一级片| 懂色av一区二区夜夜嗨| 国产日韩av网站| 精品国产亚洲一区二区在线观看 | 五月婷婷激情久久| 婷婷综合五月| 国产精品久久久久久久天堂第1集| 日韩伦理在线观看| 日韩免费高清av| 777777国产7777777| 福利一区福利二区| 国产亚洲综合视频| 日韩在线中文| 99re6在线| 一区二区电影免费观看| 色婷婷av一区二区三区在线观看 | 欧美网色网址| 国产精品国产亚洲伊人久久| 国产激情视频在线观看| 欧美精品一区二区三区蜜桃视频 | 天天操天天干天天爽| 色婷婷激情一区二区三区| 中文字幕观看av| 日本vs亚洲vs韩国一区三区 | 成人一级免费视频| **网站欧美大片在线观看| 国产女人18毛片水真多18| 免费成人美女在线观看| 日韩久久久久久久久久久久| 久久天堂久久| 欧美老肥婆性猛交视频| 亚洲无码精品在线观看| 亚洲国产aⅴ天堂久久| 丰满人妻一区二区三区免费视频棣| 亚洲精品tv久久久久久久久久| 国产欧美一区二区三区在线| 爱福利在线视频| 亚洲成人激情图| ,亚洲人成毛片在线播放| 精品国产1区2区| 短视频在线观看| 国内一区二区视频| jizz欧美激情18| av成人毛片| 久久久久久av无码免费网站下载| 999久久精品| 91爱视频在线| 国产精品一区在线看| 亚洲成av人片在线观看香蕉| 九九热在线视频播放| 亚洲日本在线a| 久久久久久久久福利| 91视视频在线直接观看在线看网页在线看 | 视频在线一区| 国产精品青青在线观看爽香蕉| 大片免费在线观看| 一本大道亚洲视频| 欧美老女人性开放| 亚洲国产福利在线| 免费精品一区二区| 色久优优欧美色久优优| 在线观看 中文字幕| 夜夜夜精品看看| 天天看片中文字幕| 日韩毛片在线免费观看| 91动漫免费网站| 国产精品女人毛片| 精品无码av一区二区三区| 免费看欧美女人艹b| 日韩视频一二三| 天天操综合520| 国产综合 伊人色| 加勒比色老久久爱综合网| 国产精品久久91| 一二区成人影院电影网| 国产精品第100页| 国产成+人+综合+亚洲欧美| 国产精品扒开腿做| 免费视频成人| 成人午夜激情免费视频| 老司机亚洲精品一区二区| 欧美一区二区三区四区在线| 性国裸体高清亚洲| 日本乱人伦a精品| 欧美日韩激情电影| 国产精品视频资源| 欧洲亚洲精品久久久久| 成人精品网站在线观看| 不卡的国产精品| 91精品黄色| 成人午夜网址| 噜噜噜噜噜久久久久久91| 亚洲国产最新| 亚洲欧美久久234| 永久91嫩草亚洲精品人人| 日韩av在线一区二区三区| 久久资源中文字幕| 熟妇熟女乱妇乱女网站| 久久高清精品| 精品免费久久久久久久| 18成人免费观看视频| 欧美丰满熟妇bbbbbb百度| 国产精品日本| 日本十八禁视频无遮挡| 久久精品亚洲一区二区| 精品999在线| 国产乱对白刺激视频不卡| 91视频在线免费| 国产欧美在线观看一区| 激情综合丁香五月| 日本一区二区免费在线| 国产黄色的视频| 五月天欧美精品| 妺妺窝人体色www聚色窝仙踪| 国产精品国产a| 久久精品人妻一区二区三区| 色哟哟亚洲精品| 亚洲中文字幕无码爆乳av| 日韩一区二区影院| 手机在线观看毛片| 亚洲欧美日韩精品久久| 黄色的网站在线观看| 欧美激情欧美激情| 日韩久久一区二区三区| 99久久99久久| 欧美三级伦理在线| 成人一区二区av| 视频一区二区不卡| 日本中文字幕精品| 国产夜色精品一区二区av| 91在线播放观看| 在线免费视频一区二区| www.热久久| 尤物yw午夜国产精品视频| av在线加勒比| 国产综合香蕉五月婷在线| 91精品国产一区二区在线观看| 国产在线观看一区二区三区 | 日韩国产大片| 美女被啪啪一区二区| 欧美高清日韩| 日本不卡一区二区在线观看| 91蜜桃网址入口| 激情五月少妇a| 在线不卡a资源高清| 免费在线国产| 韩国欧美亚洲国产| 国产成人精品一区二区三区免费| 久草中文综合在线| 中文字幕在线亚洲| 国产性生活一级片| 国产极品人妖在线观看| 亚洲综合激情另类小说区| 免费在线观看黄视频| 色婷婷狠狠综合| 午夜av免费观看| 日韩成人av网| a'aaa级片在线观看| 欧美中文字幕在线播放| 精品精品精品| 日本手机在线视频| 成人深夜福利app| 久久久无码精品亚洲国产| 影音先锋一区| 99精品在线免费视频| 国产91精品免费| 久久久久黄色片| 韩国女主播成人在线观看| 4p变态网欧美系列| 欧美gv在线观看| 国产精品免费一区二区三区四区| 亚洲视频分类| 能在线观看的av| 久久久综合精品| 潘金莲一级淫片aaaaaa播放| 亚洲欧美另类人妖| 欧美特大特白屁股xxxx| 日本午夜精品一区二区三区| 肉色丝袜一区二区| 2018国产精品| 亚洲一二三专区| 久久成人在线观看| 日韩女同互慰一区二区| 高h视频在线播放| 欧美精品123| 国产一区二区h| 精品国产免费观看| 亚洲福利在线播放| 免费观看成人性生生活片 | 国产麻豆精品视频| 91动漫免费网站| 精品日韩av一区二区| 欧美舌奴丨vk视频| 视色,视色影院,视色影库,视色网| 蜜桃视频一区二区三区| 青青操国产视频| 亚洲欧美一区二区激情| 伊人国产精品| 男人日女人逼逼| 最新国产成人在线观看| 性感美女视频一二三| 91精品视频免费| 亚洲一区区二区| 欧洲猛交xxxx乱大交3| 日韩精品免费综合视频在线播放| 98色花堂精品视频在线观看| 成人欧美一区二区三区视频| 免播放器亚洲| 国产亚洲精品精品精品| 亚洲国产成人精品女人久久久 |