JNI Java本地接口(双向接口)
JNI:Java程序(VM)與本地函數的雙向接口(調用通道)
(1)Java?--JNI通道-->本地函數(JNI函數)
(2)本地程序--JNI通道的JNI接口-->Java
??????
JNI使Java喪失跨平臺性(本地程序需重新編譯)??
?????? ?
本地函數通過JNI以Java機制與VM交互,而不是C/C++規(guī)則
?
使用本地函數實現類庫沒有實現或效率更高的本地功能,最后通過JNI與VM交互
?
利用JNI函數,程序員可從一個固有方法的內部與JVM打交道。正如大家在前面的例子中看到的那樣,每個JNI固有方法都會接收一個特殊的自變量作為自己的第一個參數:JNIEnv自變量——它是指向類型為JNIEnv_的一個特殊JNI數據結構的指針。JNI數據結構的一個元素是指向由JVM生成的一個數組的指針;該數組的每個元素都是指向一個JNI函數的指針。可從固有方法的內部發(fā)出對JNI函數的調用,做法是撤消對這些指針的引用(具體的操作實際很簡單)。每種JVM都以自己的方式實現了JNI函數,但它們的地址肯定位于預先定義好的偏移處。
利用JNIEnv自變量,程序員可訪問一系列函數。這些函數可劃分為下述類別:
- 傳遞或返回數據
- 操作實例變量或調用使用垃圾回收的堆中對象的方法
- 操作類變量或調用類方法
- 操作數組
- 對堆中對象加鎖,以便被當前線程獨占
- 創(chuàng)建對象
- 加載類
- 拋異常
- 捕獲本地方法調用的Java方法拋出的異常
- 捕獲虛擬機異常
- 告訴垃圾回收器某個對象不再需要
JNI函數的數量相當多,這里不再詳述。相反,我會向大家揭示使用這些函數時背后的一些基本原理。欲了解更詳細的情況,請參閱自己所用編譯器的 JNI文檔。
若觀察一下jni.h頭文件,就會發(fā)現在#ifdef _cplusplus預處理器條件的內部,當由C++編譯器編譯時,JNIEnv_結構被定義成一個類。這個類包含了大量內嵌函數。通過一種簡單而且熟悉的語法,這些函數讓我們可以從容訪問JNI函數。例如,前例包含了下面這行代碼:
(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);它在C++里可改寫成下面這個樣子:
jEnv->ReleaseStringUTFChars(jMsg,msg);大家可注意到自己不再需要同時撤消對jEnv的兩個引用,相同的指針不再作為第一個參數傳遞給JNI函數調用。在這些例子剩下的地方,我會使用 C++風格的代碼。
總結
以上是生活随笔為你收集整理的JNI Java本地接口(双向接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLmalloc 内存分配算法
- 下一篇: setjmp和longjmp