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

Java JNI深度分析與實(shí)踐

開發(fā) 后端
Java JNI是Java Native Interface的縮寫,中文可譯為Java本地調(diào)用。Java Native Interface (JNI)標(biāo)準(zhǔn)成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。本文向您詳細(xì)介紹Java JNI。

Java 環(huán)境和語言對于應(yīng)用程序開發(fā)來說是非常安全和高效的。但是,一些應(yīng)用程序卻需要執(zhí)行純 Java 程序無法完成的一些任務(wù),比如:

與舊有代碼集成,避免重新編寫。

實(shí)現(xiàn)可用類庫中所缺少的功能。舉例來說,在 Java 語言中實(shí)現(xiàn) ping 時,您可能需要 Internet Control Message Protocol (ICMP) 功能,但基本類庫并未提供它。

***與使用 C/C++ 編寫的代碼集成,以充分發(fā)掘性能或其他與環(huán)境相關(guān)的系統(tǒng)特性。

解決需要非 Java 代碼的特殊情況。舉例來說,核心類庫的實(shí)現(xiàn)可能需要跨包調(diào)用或者需要繞過其他 Java 安全性檢查。

JNI 允許您完成這些任務(wù)。它明確分開了 Java 代碼與本機(jī)代碼(C/C++)的執(zhí)行,定義了一個清晰的 API 在這兩者之間進(jìn)行通信。從很大程度上說,它避免了本機(jī)代碼對 JVM 的直接內(nèi)存引用,從而確保本機(jī)代碼只需編寫一次,并且可以跨不同的 JVM 實(shí)現(xiàn)或版本運(yùn)行。

借助 JNI,本機(jī)代碼可以隨意與 Java 對象交互,獲取和設(shè)計字段值,以及調(diào)用方法,而不會像 Java 代碼中的相同功能那樣受到諸多限制。這種自由是一把雙刃劍:它犧牲 Java 代碼的安全性,換取了完成上述所列任務(wù)的能力。在您的應(yīng)用程序中使用 JNI 提供了強(qiáng)大的、對機(jī)器資源(內(nèi)存、I/O 等)的低級訪問,因此您不會像普通 Java 開發(fā)人員那樣受到安全網(wǎng)的保護(hù)。JNI 的靈活性和強(qiáng)大性帶來了一些編程實(shí)踐上的風(fēng)險,比如導(dǎo)致性能較差、出現(xiàn) bug 甚至程序崩潰。您必須格外留意應(yīng)用程序中的代碼,并使用良好的實(shí)踐來保障應(yīng)用程序的總體完整性。

本文介紹 JNI 用戶最常遇到的 10 大編碼和設(shè)計錯誤。其目標(biāo)是幫助您認(rèn)識到并避免它們,以便您可以編寫安全、高效、性能出眾的 JNI 代碼。本文還將介紹一些用于在新代碼或已有代碼中查找這些問題的工具和技巧,并展示如何有效地應(yīng)用它們。

Java JNI 編程缺陷可以分為兩類

性能:代碼能執(zhí)行所設(shè)計的功能,但運(yùn)行緩慢或者以某種形式拖慢整個程序。

正確性:代碼有時能正常運(yùn)行,但不能可靠地提供所需的功能;最壞的情況是造成程序崩潰或掛起。

性能缺陷

程序員在使用 JNI 時的 5 大性能缺陷如下:

◆不緩存方法 ID、字段 ID 和類

◆觸發(fā)數(shù)組副本

◆回訪(Reaching back)而不是傳遞參數(shù)

◆錯誤認(rèn)定本機(jī)代碼與 Java 代碼之間的界限

◆使用大量本地引用,而未通知 JVM

◆不緩存方法 ID、字段 ID 和類

要訪問 Java 對象的字段并調(diào)用它們的方法,本機(jī)代碼必須調(diào)用 FindClass()、GetFieldID()、GetMethodId() 和 GetStaticMethodID()。對于 GetFieldID()、GetMethodID() 和 GetStaticMethodID(),為特定類返回的 ID 不會在 JVM 進(jìn)程的生存期內(nèi)發(fā)生變化。但是,獲取字段或方法的調(diào)用有時會需要在 JVM 中完成大量工作,因?yàn)樽侄魏头椒赡苁菑某愔欣^承而來的,這會讓 JVM 向上遍歷類層次結(jié)構(gòu)來找到它們。由于 ID 對于特定類是相同的,因此您只需要查找一次,然后便可重復(fù)使用。同樣,查找類對象的開銷也很大,因此也應(yīng)該緩存它們。

舉例來說,清單 1 展示了調(diào)用靜態(tài)方法所需的 JNI 代碼:

清單 1. 使用 JNI 調(diào)用靜態(tài)方法

  1.    int val=1;   
  2.   jmethodID method;   
  3.   jclass cls;   
  4.   cls = (*env)->FindClass(env, "com/ibm/example/TestClass");   
  5.   if ((*env)->ExceptionCheck(env)) {   
  6.   return ERR_FIND_CLASS_FAILED;   
  7.   }   
  8.   method = (*env)->GetStaticMethodID(env, cls, "setInfo", "(I)V");   
  9.   if ((*env)->ExceptionCheck(env)) {   
  10.   return ERR_GET_STATIC_METHOD_FAILED;   
  11.   }   
  12.   (*env)->CallStaticVoidMethod(env, cls, method,val);   
  13.   if ((*env)->ExceptionCheck(env)) {   
  14.   return ERR_CALL_STATIC_METHOD_FAILED;   
  15.   } 

當(dāng)我們每次希望調(diào)用方法時查找類和方法 ID 都會產(chǎn)生六個本機(jī)調(diào)用,而不是***次緩存類和方法 ID 時需要的兩個調(diào)用。

緩存會對您應(yīng)用程序的運(yùn)行時造成顯著的影響??紤]下面兩個版本的方法,它們的作用是相同的。清單 2 使用了緩存的字段 ID:

清單 2. 使用緩存的字段 ID

  1.      int sumValues2(JNIEnv* env, jobject obj, jobject allValues){   
  2.   jint avalue = (*env)->GetIntField(env, allValues, a);   
  3.   jint bvalue = (*env)->GetIntField(env, allValues, b);   
  4.   jint cvalue = (*env)->GetIntField(env, allValues, c);   
  5.   jint dvalue = (*env)->GetIntField(env, allValues, d);   
  6.   jint evalue = (*env)->GetIntField(env, allValues, e);   
  7.   jint fvalue = (*env)->GetIntField(env, allValues, f);   
  8.   return avalue + bvalue + cvalue + dvalue + evalue + fvalue;   
  9.   } 

清單 3. 未緩存字段 ID

  1.    int sumValues2(JNIEnv* env, jobject obj, jobject allValues){   
  2.   jclass cls = (*env)->GetObjectClass(env,allValues);   
  3.   jfieldID a = (*env)->GetFieldID(env, cls, "a", "I");   
  4.   jfieldID b = (*env)->GetFieldID(env, cls, "b", "I");   
  5.   jfieldID c = (*env)->GetFieldID(env, cls, "c", "I");   
  6.   jfieldID d = (*env)->GetFieldID(env, cls, "d", "I");   
  7.   jfieldID e = (*env)->GetFieldID(env, cls, "e", "I");   
  8.   jfieldID f = (*env)->GetFieldID(env, cls, "f", "I");   
  9.   jint avalue = (*env)->GetIntField(env, allValues, a);   
  10.   jint bvalue = (*env)->GetIntField(env, allValues, b);   
  11.   jint cvalue = (*env)->GetIntField(env, allValues, c);   
  12.   jint dvalue = (*env)->GetIntField(env, allValues, d);   
  13.   jint evalue = (*env)->GetIntField(env, allValues, e);   
  14.   jint fvalue = (*env)->GetIntField(env, allValues, f);   
  15.   return avalue + bvalue + cvalue + dvalue + evalue + fvalue 

清單 2 用 3,572 ms 運(yùn)行了 10,000,000 次。清單 3 用了 86,217 ms — 多花了 24 倍的時間。

觸發(fā)數(shù)組副本

JNI 在 Java 代碼和本機(jī)代碼之間提供了一個干凈的接口。為了維持這種分離,數(shù)組將作為不透明的句柄傳遞,并且本機(jī)代碼必須回調(diào) JVM 以便使用 set 和 get 調(diào)用操作數(shù)組元素。Java 規(guī)范讓 JVM 實(shí)現(xiàn)決定讓這些調(diào)用提供對數(shù)組的直接訪問,還是返回一個數(shù)組副本。舉例來說,當(dāng)數(shù)組經(jīng)過優(yōu)化而不需要連續(xù)存儲時,JVM 可以返回一個副本。(參見 參考資料 獲取關(guān)于 JVM 的信息)。

隨后,這些調(diào)用可以復(fù)制被操作的元素。舉例來說,如果您對含有 1,000 個元素的數(shù)組調(diào)用 GetLongArrayElements(),則會造成至少分配或復(fù)制 8,000 字節(jié)的數(shù)據(jù)(每個 long 1,000 元素 * 8 字節(jié))。當(dāng)您隨后使用 ReleaseLongArrayElements() 更新數(shù)組的內(nèi)容時,需要另外復(fù)制 8,000 字節(jié)的數(shù)據(jù)來更新數(shù)組。即使您使用較新的 GetPrimitiveArrayCritical(),規(guī)范仍然準(zhǔn)許 JVM 創(chuàng)建完整數(shù)組的副本。

GetTypeArrayRegion() 和 SetTypeArrayRegion() 方法允許您獲取和更新數(shù)組的一部分,而不是整個數(shù)組。通過使用這些方法訪問較大的數(shù)組,您可以確保只復(fù)制本機(jī)代碼將要實(shí)際使用的數(shù)組部分。

舉例來說,考慮相同方法的兩個版本,如清單 4 所示:

清單 4. 相同方法的兩個版本

  1.  jlong getElement(JNIEnv* env, jobject obj, jlongArray arr_j,   
  2.   int element){   
  3.   jboolean isCopy;   
  4.   jlong result;   
  5.   jlong* buffer_j = (*env)->GetLongArrayElements(env, arr_j, &isCopy);   
  6.   result = buffer_j[element];   
  7.   (*env)->ReleaseLongArrayElements(env, arr_j, buffer_j, 0);   
  8.   return result;   
  9.   }   
  10.   jlong getElement2(JNIEnv* env, jobject obj, jlongArray arr_j,   
  11.   int element){   
  12.   jlong result;   
  13.   (*env)->GetLongArrayRegion(env, arr_j, element,1, &result);   
  14.   return result;   
  15.   }   
  16.   } 

 

【編輯推薦】

  1. Java通過JNI調(diào)用C語言的方法
  2. Java: JNI完全手冊
  3. 探秘Java 7:JVM動態(tài)語言支持詳解
  4. JScript、Java、JavaScript和JSP總結(jié)
  5. Java JDBC編程總結(jié)
責(zé)任編輯:佚名 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2011-06-16 08:43:39

JAVAJIN

2024-12-24 14:01:10

2025-03-27 04:10:00

2024-08-30 09:53:17

Java 8編程集成

2024-09-19 08:49:13

2024-10-10 08:26:30

2025-11-04 01:30:00

Paimon分布式文件系統(tǒng)

2023-12-04 16:18:30

2009-07-24 13:54:39

MVVM模式

2018-03-14 08:10:44

深度學(xué)習(xí)

2023-05-08 12:03:14

Linux內(nèi)核進(jìn)程

2025-05-12 01:33:00

異步函數(shù)Promise

2025-08-11 02:00:00

2022-07-08 09:26:45

Flink快手計算

2024-07-08 07:30:47

2025-11-17 15:27:41

紅帽AI

2009-09-03 11:47:43

Groovy與Java

2022-12-21 08:32:34

OLAPDruid架構(gòu)

2017-06-16 09:39:32

優(yōu)酷實(shí)踐阿里云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

www.久久久久久| 日韩福利小视频| 日本高清不卡一区二区三区视频 | 热久久免费国产视频| 30一40一50老女人毛片| 91精品麻豆| 天天影视网天天综合色在线播放| 日本在线播放一区| 午夜精品在线播放| 日韩电影在线免费| 久久久久久久影院| 在线观看亚洲大片短视频| 91午夜精品| 欧美日韩一区中文字幕| 国产午夜福利100集发布| 在线a免费看| 亚洲一区网址| 在线欧美日韩精品| 日本免费成人网| 成人在线视频成人| 成人va在线观看| 国产日韩精品综合网站| 五月天综合激情网| 欧美va天堂| 欧美精品九九99久久| 屁屁影院ccyy国产第一页| 高清av电影在线观看| av电影天堂一区二区在线观看| 久久国产精品免费视频 | 久久久久99精品| 欧美xxxx中国| 永久免费精品影视网站| 大桥未久恸哭の女教师| 美女久久精品| 欧美日韩国产精品成人| 制服诱惑一区| 国产毛片毛片毛片毛片| 亚洲精品中文字幕乱码| 一本色道久久综合狠狠躁篇的优点| 制服丝袜在线第一页| 国产免费av国片精品草莓男男| 欧洲人成人精品| 久久精品香蕉视频| 岛国视频免费在线观看| 99久久夜色精品国产网站| 成人综合av网| 成人激情四射网| 国产综合成人久久大片91| 国产精品狼人色视频一区| 日本高清www免费视频| 国内在线观看一区二区三区| 久久99久久99精品免观看粉嫩| 日韩一卡二卡在线观看| 欧美xxav| 操人视频在线观看欧美| 日本精品在线免费观看| 91久久国产| 欧美mv和日韩mv的网站| 久久久久无码精品| 1313精品午夜理伦电影| 欧美xxxxx牲另类人与| 香蕉久久久久久av成人| 第四色中文综合网| 亚洲国产欧美一区二区丝袜黑人 | 亚洲欧美一区二区三区孕妇| 日韩精品一线二线三线| 91caoporm在线视频| 国产精品九色蝌蚪自拍| 黄色影视在线观看| 亚洲wwwww| 精品久久久久久久大神国产| 毛片av免费在线观看| 国产a亚洲精品| 91精品国产91久久综合桃花 | 都市激情亚洲欧美| 日韩激情视频在线| 国产精品天天干| 亚洲色图网站| 91精品国产91久久| 最近中文字幕在线免费观看 | 在线亚洲欧美专区二区| 日本黄大片一区二区三区| 精品国产亚洲日本| 亚洲国产精品va| 国产九九在线观看| 成人激情久久| 亚洲黄页视频免费观看| 日本成人午夜影院| 欧美成人一品| 欧美中文在线观看| 国产精品伦理一区| 99综合电影在线视频| 亚洲国产精品日韩| 国产丝袜在线观看视频| 91成人在线观看喷潮| 手机在线免费毛片| 亚洲人成亚洲精品| 欧美成人午夜激情| 99久久久无码国产精品免费蜜柚 | 成人免费视频视频在| 国产乱视频在线观看| 亚洲精品自拍动漫在线| 久久国产亚洲精品无码| 国产美女视频一区二区| 亚洲片在线观看| 久久久久久久极品内射| 99久久99久久精品国产片果冰| 欧美极品第一页| 国产一卡二卡三卡| 国产ts人妖一区二区| 午夜老司机精品| 午夜激情电影在线播放| 欧美一级日韩不卡播放免费| 国产jjizz一区二区三区视频| 羞羞色午夜精品一区二区三区| 91成人在线视频| 97人妻人人澡人人爽人人精品| 26uuu国产日韩综合| 菠萝蜜视频在线观看入口| 国产69精品久久| 亚洲免费av网址| 国产无码精品视频| 国产精品亚洲一区二区三区在线| 日本在线成人一区二区| 涩涩视频在线免费看| 精品国产一区二区三区忘忧草| 成年人视频软件| 久久久精品五月天| 久久久久一区二区| 91丝袜在线| 精品日韩在线观看| 日韩女优一区二区| 久久av老司机精品网站导航| 日韩成人av电影在线| 欧美sm一区| 亚洲国产精品字幕| 国产午夜激情视频| 国产91露脸合集magnet| www国产免费| **日韩最新| 久久久精品欧美| 欧产日产国产69| 成人免费观看男女羞羞视频| 国产精品jizz视频| av免费看在线| 日韩一级片在线观看| 女人18毛片毛片毛片毛片区二 | 成人美女av在线直播| 调教视频免费在线观看| 欧美日韩色综合| 老司机深夜福利网站| 久久99国产精品尤物| 亚洲日本欧美在线| 7777kkk亚洲综合欧美网站| 日韩三级免费观看| 毛片aaaaa| 成人自拍视频在线观看| 久久视频这里有精品| 日韩福利视频一区| 热门国产精品亚洲第一区在线| 免费a级毛片在线观看| 在线观看视频一区二区| 男女男精品视频网站| 黑人巨大精品欧美一区| 久久久久久高清| 自拍视频在线看| 在线观看日韩视频| 国产又黄又大又爽| 亚洲综合激情小说| 国产ts丝袜人妖系列视频| 久久精品系列| 亚洲天堂av免费在线观看| 日韩黄色av| 91精品国产91久久久久久吃药| 日韩a在线观看| 欧美日韩亚洲高清一区二区| 日本中文字幕免费在线观看| 99视频在线精品| 在线免费视频a| 欧美一区久久| 农村寡妇一区二区三区| 国产亚洲欧美日韩精品一区二区三区 | 欧美午夜女人视频在线| 国产wwwwxxxx| 本田岬高潮一区二区三区| 中文字幕在线观看第三页| 欧美国产美女| 久久精品日产第一区二区三区乱码| 性高爱久久久久久久久| 久久综合九色九九| 日本免费一区二区三区最新| 欧美精品一卡二卡| 国产 欧美 日韩 在线| 国产精品麻豆网站| 在线精品一区二区三区| 老汉av免费一区二区三区| 日本精品久久久久久久久久| 欧美猛男同性videos| 99久久99久久精品国产片| 三上悠亚激情av一区二区三区| 欧美成人h版在线观看| 男人天堂资源在线| 日韩午夜中文字幕| 国产精品51麻豆cm传媒| 精品国产精品自拍| 国产视频精品免费| 久久免费看少妇高潮| 国产吃瓜黑料一区二区| 久久99精品久久久久久动态图| 日本在线xxx| 中文精品电影| 亚洲精品在线免费| 欧美日韩一区二区三区不卡视频| 91天堂在线观看| 中文另类视频| 欧美一级淫片丝袜脚交| 三级在线播放| 精品国产一区二区三区不卡| 亚洲系列在线观看| 日本精品视频一区二区| 一区二区三区视频免费看| 亚洲精品v日韩精品| 网爆门在线观看| 久久精品夜色噜噜亚洲aⅴ| 日韩综合第一页| 国产精品综合久久| 手机免费av片| 捆绑调教美女网站视频一区| 久久久久久久少妇| 日韩欧美二区| 日本一区免费在线观看| 亚洲人成网站77777在线观看| 国内精品视频免费| 成人动态视频| 97久久人人超碰caoprom欧美| **欧美日韩在线| 91久久精品久久国产性色也91| 国产69精品久久久久按摩| 国产精品久久视频| 日韩高清不卡| 国产乱人伦真实精品视频| 成人午夜一级| 国产精品久久久久久久久久99 | 一本久道综合久久精品| 亚洲 欧美 综合 另类 中字| 亚洲第一伊人| 日日摸日日碰夜夜爽无码| 日韩视频一区二区三区在线播放免费观看| 久久手机在线视频| 亚洲国内精品| 国产91美女视频| 久久精品一区二区国产| 尤蜜粉嫩av国产一区二区三区| 日本欧美大码aⅴ在线播放| 亚洲国产成人va在线观看麻豆| 美美哒免费高清在线观看视频一区二区| 另类小说色综合| 欧美午夜电影在线观看 | 精品久久久三级| 日本欧美三级| 茄子视频成人在线观看| 国产成人高清激情视频在线观看 | 国产另类第一区| 深夜视频一区二区| 国产日韩中文字幕| 精品视频成人| 精品视频一区二区| 精品国产一区二区三区av片| 99理论电影网| 欧美美女黄色| 亚洲精品欧洲精品| 911精品美国片911久久久| 黄色特一级视频| 国产精品嫩草99av在线| 天天影视综合色| 国产乱妇无码大片在线观看| 精品视频站长推荐| 欧美国产精品中文字幕| 免费中文字幕日韩| 亚洲成人av在线电影| 高潮无码精品色欲av午夜福利| 91精品免费在线观看| 日日躁夜夜躁白天躁晚上躁91| 亚洲欧美日韩网| 国产在线二区| 8x海外华人永久免费日韩内陆视频| 久久夜夜操妹子| 5566av亚洲| 久久av资源| 女人床在线观看| 日本v片在线高清不卡在线观看| 在线观看av免费观看| 91女厕偷拍女厕偷拍高清| 999福利视频| 精品日韩中文字幕| 国产精品久久久久久久久毛片| 亚洲福利视频在线| 午夜激情视频在线| 欧美亚洲视频在线观看| 精品国产麻豆| 午夜欧美性电影| 国产亚洲精品v| 69久久精品无码一区二区| 国产欧美精品区一区二区三区| 久久精品久久精品久久| 欧美巨大另类极品videosbest | 亚洲精品资源| 中文字幕色网站| 日本一区二区三区在线不卡| 日韩精品久久久久久久| 在线综合+亚洲+欧美中文字幕| 免费人成黄页在线观看忧物| 久久久久久噜噜噜久久久精品| 亚洲欧美专区| 午夜精品一区二区三区四区| 国产一区导航| 欧美极品jizzhd欧美仙踪林| 亚洲特黄一级片| 精品乱码一区内射人妻无码| 亚洲精品美女视频| 视频在线这里都是精品| 国产综合视频在线观看| av资源久久| 男人操女人免费| 美腿丝袜亚洲色图| 欧美做受喷浆在线观看| 亚洲成av人片www| 国产成人av免费看| 久久久精品视频在线观看| 欧美成人毛片| 亚洲国产精品123| 热久久免费视频| 久操视频在线观看免费| 91福利小视频| 成人免费高清在线播放| 国产成人一区二| 国产欧美日韩| 天天影视综合色| 欧美激情一区三区| 中文字幕1区2区3区| 中文字幕免费精品一区| 精品裸体bbb| 亚洲精品成人自拍| 美女免费视频一区二区| av片在线免费看| 欧美精品一卡两卡| 成年人黄视频在线观看| 午夜精品久久久久久久99热浪潮| 日韩精品中文字幕吗一区二区| 一区二区三区四区免费观看| 国产乱人伦精品一区二区在线观看 | 国产又黄又爽视频| 久久精品成人欧美大片| 精品欧美视频| 久久久亚洲精品无码| 91丨九色丨蝌蚪丨老版| 91视频久久久| 日韩亚洲第一页| 91成人福利| 国产精品无码av在线播放| 久久久久久电影| 中文字幕在线网址| 久久天天躁狠狠躁夜夜av| 日韩成人18| 欧美极品欧美精品欧美| 国产视频911| 92久久精品一区二区| 日韩成人在线网站| 中文字幕资源网在线观看免费| 日韩精品国内| 国产精品小仙女| 国产www在线| 日韩视频欧美视频| 成人资源在线播放| 亚洲人成无码www久久久| 中文av一区特黄| 黄色av网址在线| 日本免费一区二区三区视频观看| 欧美黄视频在线观看| 欧美不卡在线播放| 国产三区在线成人av| 亚洲一区中文字幕在线| 欧美激情精品久久久久久黑人 | 中文字幕在线乱| 99久久久精品免费观看国产蜜| 国产一卡二卡三卡| 欧美国产日本高清在线| 九九精品在线| 久久久久久国产精品日本| 色婷婷综合久久| 亚洲欧美日韩成人在线| 国产精品青草久久久久福利99| 欧美午夜久久| 五月激情四射婷婷| 精品国产免费人成在线观看| 欧美日韩尤物久久| 青青草国产免费| 亚洲天堂成人网| 国产午夜在线观看| 99在线视频免费观看|