1. 程式人生 > >Android JNI 學習(六):JNI 介面整理 — Object Operations Api

Android JNI 學習(六):JNI 介面整理 — Object Operations Api

一、AllocObject

jobjectAllocObject(JNIEnv *env, jclass clazz);

分配新 Java 物件而不呼叫該物件的任何建構函式。返回該物件的引用。

clazz 引數務必不要引用陣列類。

引數:

env:JNI 介面指標。

clazz:Java 類物件。

返回值:

返回 Java 物件。如果無法構造該物件,則返回NULL

丟擲:

InstantiationException:如果該類為一個介面或抽象類。

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

二、NewObject、NewObjectA、NewObjectV

jobjectNewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
jobject NewObjectA(JNIEnv *env,jclass clazz, jmethodID methodID, jvalue *args);
jobject NewObjectV(JNIEnv *env,jclass clazz, jmethodID methodID, va_list args);

構造新 Java 物件。方法 ID指示應呼叫的建構函式方法。該 ID 必須通過呼叫 GetMethodID() 獲得,且呼叫時的方法名必須為 <init>

,而返回型別必須為 void (V)。

clazz引數務必不要引用陣列類。

NewObject

程式設計人員應將傳遞給建構函式的所有引數緊跟著放在 methodID 引數的後面。NewObject()收到這些引數後,將把它們傳給程式設計人員所要呼叫的 Java 方法。

NewObjectA

程式設計人員應將傳遞給建構函式的所有引數放在 jvalues 型別的陣列 args 中,該陣列緊跟著放在 methodID 引數的後面。NewObject()收到陣列中的這些引數後,將把它們傳給程式設計人員所要呼叫的 Java 方法。

NewObjectV

程式設計人員應將傳遞給建構函式的所有引數放在va_list 型別的引數 args 中,該引數緊跟著放在 methodID 引數的後面。NewObject()收到這些引數後,將把它們傳給程式設計人員所要呼叫的 Java 方法。

引數:

env:JNI 介面指標。

clazz:Java 類物件。

methodID:建構函式的方法 ID。

NewObject 的其它引數:

傳給建構函式的引數。

NewObjectA 的其它引數:

args:傳給建構函式的引數陣列。

NewObjectV 的其它引數:

args:傳給建構函式的引數 va_list。

返回值:

返回 Java 物件,如果無法構造該物件,則返回NULL

丟擲異常/錯誤:

InstantiationException:如果該類為介面或抽象類。

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

三、GetObjectClass

jclassGetObjectClass(JNIEnv *env, jobject obj);

返回物件的類。

引數:

env:JNI 介面指標。

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

返回值:

返回 Java 類物件。

四、IsInstanceOf

jbooleanIsInstanceOf(JNIEnv *env, jobject obj, jclass clazz);

測試物件是否為某個類的例項。

引數:

env:JNI 介面指標。

obj:Java 物件。

clazz:Java 類物件。

返回值:

如果可將 obj 強制轉換為 clazz,則返回 JNI_TRUE。否則返回 JNI_FALSENULL 物件可強制轉換為任何類。

五、IsSameObject

jbooleanIsSameObject(JNIEnv *env, jobject ref1,  jobject ref2);

測試兩個引用是否引用同一 Java 物件。

引數:

env:JNI 介面指標。

ref1:Java 物件。

ref2:Java 物件。

返回值:

如果 ref1 和 ref2 引用同一 Java 物件或均為 NULL,則返回 JNI_TRUE。否則返回 JNI_FALSE