Java中JNI的使用詳解第二篇:JNIEnv類型和jobject類型的解釋

上一篇說的是一個簡單的應用,說明JNI是怎麼工做的,這一篇主要來講一下,那個本地方法sayHello的參數的說明,以及其中方法的使用java

首先來看一下C++中的sayHello方法的實現:數組

[cpp] view plaincopy在CODE上查看代碼片派生到個人代碼片函數

  1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  spa

  2. {  .net

  3. cout<<"Hello World"<<endl;  指針

  4. }  code

對於這個方法參數中的JNIEnv* env參數的解釋:對象

JNIEnv類型實際上表明瞭Java環境,經過這個JNIEnv* 指針,就能夠對Java端的代碼進行操做。例如,建立Jaa類中俄對象,調用Java對象的方法,獲取Java對象中的屬性等等。JNIEnv的指針會被 JNI傳入到本地方法的實現函數中來對Java端的代碼進行操做。blog

JNIEnv類中有不少函數能夠用:ip

NewObject:建立Java類中的對象

NewString:建立Java類中的String對象

New<Type>Array:建立類型爲Type的數組對象

Get<Type>Field:獲取類型爲Type的字段

Set<Type>Field:設置類型爲Type的字段的值

GetStatic<Type>Field:獲取類型爲Type的static的字段

SetStatic<Type>Field:設置類型爲Type的static的字段的值

Call<Type>Method:調用返回類型爲Type的方法

CallStatic<Type>Method:調用返回值類型爲Type的static方法

等許多的函數,具體的能夠查看jni.h文件中的函數名稱。


參數:jobject obj的解釋:

若是native方法不是static的話,這個obj就表明這個native方法的類實例

若是native方法是static的話,這個obj就表明這個native方法的類的class對象實例(static方法不須要類實例的,因此就表明這個類的class對象)


下面來看一下Java和C++中的基本類型的映射關係:


具體的說明能夠查看jni.h文件。


爲了可以在C/C++中使用Java類,jni.h頭文件中專門定義了jclass類型來表示Java中的Class類

JNIEnv類中有以下幾個簡單的函數能夠取得jclass:

jclass FindClass(const char* clsName):經過類的名稱(類的全名,這時候包名不是用.號,而是用/來區分的)來獲取jclass

如: jclass str = env->FindClass("java/lang/String");獲取Java中的String對象的class對象。

jclass GetObjectClass(jobject obj):經過對象實例來獲取jclass,至關於java中的getClass方法

jclass GetSuperClass(jclass obj):經過jclass能夠獲取其父類的jclass對象


在C/C++本地代碼中訪問Java端的代碼,一個常見的應用就是獲取類的屬性和調用類的方法,爲了在C/C++中表示屬性和方法,JNI在jni.h頭文件中定義了jfieldId,jmethodID類型來分別表明Java端的屬性和方法

咱們在訪問,或者設置Java屬性的時候,首先就要先在本地代碼取得表明該Java屬性的jfieldID,而後才能在本地代碼中進行Java屬性操做,一樣的,咱們須要呼叫Java端的方法時,也是須要取得表明該方法的jmethodID才能進行Java方法調用


使用JNIEnv的:

GetFieldID/GetMethodID

GetStaticFieldID/GetStaticMethodID

來取得相應的jfieldID和jmethodID

下面來具體看一下這幾個方法:

GetFieldID(jclass clazz,const char* name,const char* sign)

方法的參數說明:

clazz:這個簡單就是這個方法依賴的類對象的class對象

name:這個是這個字段的名稱

sign:這個是這個字段的簽名(咱們知道每一個變量,每一個方法都是有簽名的)

怎麼查看類中的字段和方法的簽名:

使用javap命令:


GetMethodID也可以取得構造函數的jmethodID,建立一個Java對象時能夠調用指定的構造方法,這個將在後面向你們介紹:

如:env->GetMethodID(data_Class,"<init>","()V");

下面看一下簽名的格式:


下面來看一下例子:

這裏沒有上代碼了:真正演示的時候等下一篇內容,這一篇只是說一下方法的使用:



下一篇咱們未來說一下這些方法究竟是怎麼用的。

相關文章
相關標籤/搜索