1. 程式人生 > >Android JNI 學習(七):JNI 介面整理 — Accessing Fields Api

Android JNI 學習(七):JNI 介面整理 — Accessing Fields Api

一、GetFieldID

jfieldIDGetFieldID(JNIEnv *env, jclass clazz,  const char *name, const char *sig);

返回類的例項(非靜態)域的域 ID。該域由其名稱及簽名指定。訪問器函式的Get<type>Field 及 Set<type>Field 系列使用域 ID 檢索物件域。

GetFieldID() 將未初始化的類初始化。

GetFieldID() 不能用於獲取陣列的長度域。應使用GetArrayLength()

引數:

env:JNI 介面指標。

clazz:Java 類物件。

name:0 終結的 UTF-8 字串中的域名。

sig:0 終結的 UTF-8 字串中的域簽名。

返回值:

域 ID。如果操作失敗,則返回NULL

丟擲:

NoSuchFieldError:如果找不到指定的域。

ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗。

OutOfMemoryError:如果系統記憶體不足。

二、Get<type>Field Routines

NativeTypeGet<type>Field(JNIEnv*env, jobject obj, jfieldID fieldID);

該訪問器例程系列返回物件的例項(非靜態)域的值。要訪問的域由通過呼叫GetFieldID() 而得到的域 ID 指定。

下表說明了 Get<type>Field 例程名及結果型別。應將 Get<type>Field 中的 type 替換為域的 Java 型別(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地型別。

Get<type>Field 例程名

本地型別

GetObjectField()

jobject

GetBooleanField()

jboolean

GetByteField()

jbyte

GetCharField()

jchar

GetShortField()

jshort

GetIntField()

jint

GetLongField()

jlong

GetFloatField()

jfloat

GetDoubleField()

jdouble

引數:

env:JNI 介面指標。

obj:Java 物件(不能為 NULL)。

fieldID:有效的域 ID。

返回值:

域的內容。

三、Set<type>Field Routines

voidSet<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);

該訪問器例程系列設定物件的例項(非靜態)域的值。要訪問的域由通過呼叫SetFieldID() 而得到的域 ID 指定。

下表說明了 Set<type>Field 例程名及結果型別。應將 Set<type>Field 中的 type 替換為域的 Java 型別(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地型別。

Set<type>Field 例程名

本地型別

SetObjectField()

jobject

SetBooleanField()

jboolean

SetByteField()

jbyte

SetCharField()

jchar

SetShortField()

jshort

SetIntField()

jint

SetLongField()

jlong

SetFloatField()

jfloat

SetDoubleField()

jdouble

引數:

env:JNI 介面指標。

obj:Java 物件(不能為 NULL)。

fieldID:有效的域 ID。

value:域的新值。