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_FALSE
。NULL
物件可強制轉換為任何類。
五、IsSameObject
jbooleanIsSameObject(JNIEnv *env, jobject ref1, jobject ref2);
測試兩個引用是否引用同一 Java 物件。
引數:
env:JNI 介面指標。
ref1
:Java 物件。
ref2
:Java 物件。
返回值:
如果 ref1
和 ref2
引用同一 Java 物件或均為 NULL
,則返回 JNI_TRUE
。否則返回 JNI_FALSE
。