1. 程式人生 > >Android JNI 學習(八):JNI 接口整理 — Calling Instance Methods Api

Android JNI 學習(八):JNI 接口整理 — Calling Instance Methods Api

地方 init 內存 calling idg 返回值 例程 chm sig

一、GetMethodID

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

返回類或接口實例(非靜態)方法的方法 ID。方法可在某個 clazz 的超類中定義,也可從 clazz繼承。該方法由其名稱和簽名決定。

GetMethodID() 可使未初始化的類初始化。

要獲得構造函數的方法 ID,應將 <init> 作為方法名,同時將 void (V) 作為返回類型。

參數:

env:JNI 接口指針。

clazz:Java 類對象。

name:0 終結的 UTF-8 字符串中的方法名。

sig:0 終結的 UTF-8 字符串中的方法簽名。

返回值:

方法 ID,如果找不到指定的方法,則為 NULL

拋出:

NoSuchMethodError:如果找不到指定方法。

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

OutOfMemoryError:如果系統內存不足。

二、Call<type>Method Routines、Call<type>MethodA Routines、Call<type>MethodV Routines

NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);
NativeType Call
<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); NativeType Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);

這三個操作的方法用於從本地方法調用Java 實例方法。它們的差別僅在於向其所調用的方法傳遞參數時所用的機制。

這三個操作將根據所指定的方法 ID 調用 Java 對象的實例(非靜態)方法參數 methodID 必須通過調用 GetMethodID()

來獲得。

當這些函數用於調用私有方法和構造函數時,方法 ID 必須從 obj 的真實類派生而來,而不應從其某個超類派生。

Call<type>Method Routines

編程人員應將要傳給方法的所有參數緊跟著放在 methodID 參數之後。Call<type>Method routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。

Call<type>MethodA Routines

編程人員應將要傳給方法的所有參數放在緊跟在 methodID 參數之後的 jvalues 類型數組 args 中。Call<type>MethodA routine 接受這些數組中的參數並將其傳給編程人員所要調用的 Java 方法。

Call<type>MethodV Routines

編程人員將方法的所有參數放在緊跟著在 methodID 參數之後的 va_list 類型參數變量中。Call<type>MethodV routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。

下表根據結果類型說明了各個方法調用例程。用戶應將Call<type>Method 中的 type 替換為所調用方法的 Java 類型(或使用表中的實際方法調用例程名),同時將 NativeType 替換為該例程相應的本地類型。

Call<type>Method Routines 名

本地類型

CallVoidMethod() CallVoidMethodA() CallVoidMethodV()

void

CallObjectMethod() CallObjectMethodA() CallObjectMethodV()

jobject

CallBooleanMethod() CallBooleanMethodA() CallBooleanMethodV()

jboolean

CallByteMethod() CallByteMethodA() CallByteMethodV()

jbyte

CallCharMethod() CallCharMethodA() CallCharMethodV()

jchar

CallShortMethod() CallShortMethodA() CallShortMethodV()

jshort

CallIntMethod() CallIntMethodA() CallIntMethodV()

jint

CallLongMethod() CallLongMethodA() CallLongMethodV()

jlong

CallFloatMethod() CallFloatMethodA() CallFloatMethodV()

jfloat

CallDoubleMethod() CallDoubleMethodA() CallDoubleMethodV()

jdouble

參數:

env:JNI 接口指針。

obj:Java 對象。

methodID:方法 ID。

Call<type>Method Routines的其它參數:

要傳給 Java 方法的參數。

Call<type>MethodA Routines的其它參數:

args:參數數組。

Call<type>MethodV Routines的其它參數:

args:參數的 va_list。

返回值:

返回調用 Java 方法的結果。

拋出:

執行 Java 方法時拋出的異常。

三、CallNonvirtual<type>Method Routines、CallNonvirtual<type>MethodA Routines、CallNonvirtual<type>MethodV Routines

NativeType CallNonvirtual<type>Method(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
NativeType CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, const jvalue *args);
NativeType CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args); 

這些操作根據指定的類和方法 ID 調用某 Java 對象的實例(非靜態)方法。參數 methodID 必須通過調用 clazz 類的GetMethodID() 獲得。

CallNonvirtual<type>Method 和 Call<type>Method 例程系列並不相同。Call<type>Method 例程根據對象的類調用方法,而 CallNonvirtual<type>Method 例程則根據獲得方法 ID 的(由 clazz 參數指定)類調用方法。方法 ID 必須從對象的真實類或其某個超類獲得。

CallNonvirtual<type>Method Routines

編程人員應將要傳給方法的所有參數緊跟著放在 methodID 參數之後。CallNonvirtual<type>Method routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。

CallNonvirtual<type>MethodA Routines

編程人員應將要傳給方法的所有參數放在緊跟在 methodID 參數之後的 jvalues 類型數組 args 中。CallNonvirtual<type>MethodAroutine 接受這些數組中的參數並將其傳給編程人員所要調用的 Java 方法。

CallNonvirtual<type>MethodV Routines

編程人員應將要傳給方法的所有參數放在緊跟在 methodID 參數之後的 va_list 類型參數 args 中。CallNonvirtualMethodV routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。

下表根據結果類型說明了各個方法調用例程。用戶應將CallNonvirtual<type>Method 中的 type 替換為所調用方法的 Java 類型(或使用表中的實際方法調用例程名),同時將 NativeType 替換為該例程相應的本地類型。

CallNonvirtual<type>Method Routines名

本地類型

CallNonvirtualVoidMethod() CallNonvirtualVoidMethodA() CallNonvirtualVoidMethodV()

void

CallNonvirtualObjectMethod() CallNonvirtualObjectMethodA() CallNonvirtualObjectMethodV()

jobject

CallNonvirtualBooleanMethod() CallNonvirtualBooleanMethodA() CallNonvirtualBooleanMethodV()

jboolean

CallNonvirtualByteMethod() CallNonvirtualByteMethodA() CallNonvirtualByteMethodV()

jbyte

CallNonvirtualCharMethod() CallNonvirtualCharMethodA() CallNonvirtualCharMethodV()

jchar

CallNonvirtualShortMethod() CallNonvirtualShortMethodA() CallNonvirtualShortMethodV()

jshort

CallNonvirtualIntMethod() CallNonvirtualIntMethodA() CallNonvirtualIntMethodV()

jint

CallNonvirtualLongMethod() CallNonvirtualLongMethodA() CallNonvirtualLongMethodV()

jlong

CallNonvirtualFloatMethod() CallNonvirtualFloatMethodA() CallNonvirtualFloatMethodV()

jfloat

CallNonvirtualDoubleMethod() CallNonvirtualDoubleMethodA() CallNonvirtualDoubleMethodV()

jdouble


參數:

env:JNI 接口指針。

clazz:Java 類。

obj: Java 對象。

methodID:方法 ID。

CallNonvirtual<type>Method Routines的其它參數:

要傳給 Java 方法的參數。

CallNonvirtual<type>MethodA Routines的其它參數:

args:參數數組。

CallNonvirtual<type>MethodV Routines的其它參數:

args:參數的 va_list

返回值:

調用 Java 方法的結果。

拋出:

執行 Java 方法時所拋出的異常。

Android JNI 學習(八):JNI 接口整理 — Calling Instance Methods Api