Android JNI 學習(八):JNI 接口整理 — Calling Instance Methods Api
一、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 名 |
本地類型 |
|
void |
|
jobject |
|
jboolean |
|
jbyte |
|
jchar |
|
jshort |
|
jint |
|
jlong |
|
jfloat |
|
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名 |
本地類型 |
|
void |
|
jobject |
|
jboolean |
|
jbyte |
|
jchar |
|
jshort |
|
jint |
|
jlong |
|
jfloat |
|
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