日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JNI Java本地接口(双向接口)

發布時間:2024/4/15 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI Java本地接口(双向接口) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JNI:Java程序(VM)與本地函數的雙向接口(調用通道)

(1)Java?--JNI通道-->本地函數(JNI函數)

(2)本地程序--JNI通道的JNI接口-->Java

??????

JNI使Java喪失跨平臺性(本地程序需重新編譯)??

?????? ?

本地函數通過JNI以Java機制與VM交互,而不是C/C++規則

?

使用本地函數實現類庫沒有實現或效率更高的本地功能,最后通過JNI與VM交互

?

利用JNI函數,程序員可從一個固有方法的內部與JVM打交道。正如大家在前面的例子中看到的那樣,每個JNI固有方法都會接收一個特殊的自變量作為自己的第一個參數:JNIEnv自變量——它是指向類型為JNIEnv_的一個特殊JNI數據結構的指針。JNI數據結構的一個元素是指向由JVM生成的一個數組的指針;該數組的每個元素都是指向一個JNI函數的指針??蓮墓逃蟹椒ǖ膬炔堪l出對JNI函數的調用,做法是撤消對這些指針的引用(具體的操作實際很簡單)。每種JVM都以自己的方式實現了JNI函數,但它們的地址肯定位于預先定義好的偏移處。

利用JNIEnv自變量,程序員可訪問一系列函數。這些函數可劃分為下述類別:

  • 傳遞或返回數據
  • 操作實例變量或調用使用垃圾回收的堆中對象的方法
  • 操作類變量或調用類方法
  • 操作數組
  • 對堆中對象加鎖,以便被當前線程獨占
  • 創建對象
  • 加載類
  • 拋異常
  • 捕獲本地方法調用的Java方法拋出的異常
  • 捕獲虛擬機異常
  • 告訴垃圾回收器某個對象不再需要

JNI函數的數量相當多,這里不再詳述。相反,我會向大家揭示使用這些函數時背后的一些基本原理。欲了解更詳細的情況,請參閱自己所用編譯器的 JNI文檔。

若觀察一下jni.h頭文件,就會發現在#ifdef _cplusplus預處理器條件的內部,當由C++編譯器編譯時,JNIEnv_結構被定義成一個類。這個類包含了大量內嵌函數。通過一種簡單而且熟悉的語法,這些函數讓我們可以從容訪問JNI函數。例如,前例包含了下面這行代碼:

(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);

它在C++里可改寫成下面這個樣子:

jEnv->ReleaseStringUTFChars(jMsg,msg);

大家可注意到自己不再需要同時撤消對jEnv的兩個引用,相同的指針不再作為第一個參數傳遞給JNI函數調用。在這些例子剩下的地方,我會使用 C++風格的代碼。

總結

以上是生活随笔為你收集整理的JNI Java本地接口(双向接口)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。