程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 訪問JNI函數:JNIEnv自變量

訪問JNI函數:JNIEnv自變量

編輯:關於JAVA

利用JNI函數,程序員可從一個固有方法的內部與JVM打交道。正如大家在前面的例子中看到的那樣,每個JNI固有方法都會接收一個特殊的自變量作為自己的第一個參數:JNIEnv自變量——它是指向類型為JNIEnv_的一個特殊JNI數據結構的指針。JNI數據結構的一個元素是指向由JVM生成的一個數組的指針;該數組的每個元素都是指向一個JNI函數的指針。可從固有方法的內部發出對JNI函數的調用,做法是撤消對這些指針的引用(具體的操作實際很簡單)。每種JVM都以自己的方式實現了JNI函數,但它們的地址肯定位於預先定義好的偏移處。
利用JNIEnv自變量,程序員可訪問一系列函數。這些函數可劃分為下述類別:
■獲取版本信息
■進行類和對象操作
■控制對Java對象的全局和局部引用
■訪問實例字段和靜態字段
■調用實例方法和靜態方法
■執行字串和數組操作
■產生和控制Java異常
JNI函數的數量相當多,這裡不再詳述。相反,我會向大家揭示使用這些函數時背後的一些基本原理。欲了解更詳細的情況,請參閱自己所用編譯器的JNI文檔。
若觀察一下jni.h頭文件,就會發現在#ifdef _cplusplus預處理器條件的內部,當由C++編譯器編譯時,JNIEnv_結構被定義成一個類。這個類包含了大量內嵌函數。通過一種簡單而且熟悉的語法,這些函數讓我們可以從容訪問JNI函數。例如,前例包含了下面這行代碼:
(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
它在C++裡可改寫成下面這個樣子:
jEnv->ReleaseStringUTFChars(jMsg,msg);
大家可注意到自己不再需要同時撤消對jEnv的兩個引用,相同的指針不再作為第一個參數傳遞給JNI函數調用。在這些例子剩下的地方,我會使用C++風格的代碼。

1. 訪問Java字串
作為訪問JNI函數的一個例子,請思考上述的代碼。在這裡,我們利用JNIEnv的自變量jEnv來訪問一個Java字串。Java字串采取的是Unicode格式,所以假若收到這樣一個字串,並想把它傳給一個非Unicode函數(如printf()),首先必須用JNI函數GetStringUTFChars()將其轉換成ASCII字符。該函數能接收一個Java字串,然後把它轉換成UTF-8字符(用8位寬度容納ASCII值,或用16位寬度容納Unicode;若原始字串的內容完全由ASCII構成,那麼結果字串也是ASCII)。
GetStringUTFChars是JNIEnv間接指向的那個結構裡的一個字段,而這個字段又是指向一個函數的指針。為訪問JNI函數,我們用傳統的C語法來調用一個函數(通過指針)。利用上述形式可實現對所有JNI函數的訪問。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved