訪問JNI函數:JNIEnv自變數

來源:互聯網
上載者:User

利用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函數的訪問。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.