国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

JNI學習總結

2019-11-14 23:53:59
字體:
來源:轉載
供稿:網友
JNI學習總結JNI學習總結

標簽(空格分隔): java


JNI:Java Native Interface,是一種通過java調用本地方法的技術(當然也可以反過來),隨著JDK版本的提升,JNI的效率也一直在提升。


JNI的主要實現流程:
  • 在類中以關鍵字native標記需要通過JNI調用的本地方法;
  • 在類中通過static代碼塊的方式加載DLL,System.loadLibrary("***.dll");
  • 將該類編譯為字節碼文件;
  • 使用javah -jni ***.class從該class產生對應的JNI頭文件。該頭文件中包含以全限定名標識的JNI方法的聲明;
  • 根據頭文件來編寫響應的實現代碼;(需要注意Java與本地方法之間的類型映射關系)
  • 將JNI實現編譯為動態鏈接庫。

何時使用JNI:
  • 需要直接操作物理設備,而缺乏相關的驅動,則可以通過C或匯編來實現驅動,通過JNI來操作設備;
  • 含有大量的數學運算,使用純java實現相對效率較低;
  • 已有大量可重用的C/C++實現;
  • 包含Java難以應付的開銷,如大量的網絡連接;
  • 進程間通信,比如調用MATLAB聯合仿真。

使用JNI時需要注意的性能問題:
  • 應盡量減少越界訪問,如頻繁地調用(env)->FindClass、(env)->GetMethodID以及(env)->GetFieldID等方法。由于類一旦加載,字段和方法ID不會再發生變化,可在本地代碼中緩存類,字段和方法ID,達到重用的目的;
  • 盡量少的去創建數組的副本,如果只使用數組的一部分,可以只創建該區域的副本;
  • 如果傳值可以達到目的,最好不要傳對象的引用,從而避免越界訪問;
  • 對于本地引用,應在使用結束后調用DeleteLocalRef() 顯示刪除該引用,若需要保存大量的本地引用,需要通過EnsureLocalCapacity()方法通知JVM;
  • 定義好問題邊界。

使用JNI時需要注意的安全問題:
  • 為每個getXXX調用releaseXXX(將數組寫回);
  • JVM中每個線程都有自己的JNIEnv,因此在多線程環境中不應該使用其他線程的Env,避免取得錯誤的值;
  • 檢測異常;
  • 檢測返回值;
  • 記得釋放全局引用,因為在創建全局引用時,jvm會將其加入到一個禁止垃圾回收的列表中去。如果在本地方法返回時沒有釋放該全局引用,可能會造成內存泄漏;
  • 確保代碼不會在 GetXXXCritical() 和 ReleaseXXXCritical() 調用之間發起任何 JNI 調用或由于任何原因出現阻塞。

參考: http://joanzq.VEvb.com/blog/161152 http://www.ibm.com/developerworks/cn/java/j-jni/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彩票| 谷城县| 广灵县| 饶河县| 道真| 贵港市| 祁东县| 正阳县| 乡城县| 镇坪县| 沧州市| 武城县| 柳州市| 北碚区| 钟祥市| 蚌埠市| 拜泉县| 区。| 贡觉县| 肇东市| 察哈| 勐海县| 定西市| 昌图县| 若羌县| 江津市| 云林县| 苏州市| 巴南区| 金堂县| 清苑县| 尤溪县| 揭东县| 攀枝花市| 临猗县| 锦州市| 东丽区| 关岭| 延吉市| 阜城县| 鲁甸县|