《Java 本地接口規範》- JNI 函數(二)
對象操作
AllocObject
jobjectAllocObject(JNIEnv *env, jclass clazz);
分配新 Java 對象而不調用該對象的任何構造函數。返回該對象的引用。
參數:
env:JNI 接口指針。
返回值:
返回 Java 對象。如果無法構造該對象,則返回NULL
。
拋出:
InstantiationException:如果該類為一個接口或抽象類。
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
)。
NewObject
編程人員應將傳遞給構造函數的所有參數緊跟著放在 methodID
參數的後麵。NewObject()
收到這些參數後,將把它們傳給編程人員所要調用的 Java 方法。
NewObjectA
編程人員應將傳遞給構造函數的所有參數放在 jvalues
類型的數組 args
中,該數組緊跟著放在
methodID
參數的後麵。NewObject()
收到數組中的這些參數後,將把它們傳給編程人員所要調用的 Java 方法。
NewObjectV
編程人員應將傳遞給構造函數的所有參數放在 va_list
類型的參數 args
中,該參數緊跟著放在
methodID
參數的後麵。NewObject()
收到這些參數後,將把它們傳給編程人員所要調用的 Java 方法。
參數:
env:JNI 接口指針。
NewObject 的其它參數:
傳給構造函數的參數。
NewObjectA 的其它參數:
args:傳給構造函數的參數數組。
NewObjectV 的其它參數:
args:傳給構造函數的參數 va_list。
返回值:
返回 Java 對象,如果無法構造該對象,則返回NULL
。
拋出:
InstantiationException:如果該類為接口或抽象類。
GetObjectClass
jclassGetObjectClass(JNIEnv *env, jobject obj);
參數:
env:JNI 接口指針。
返回值:
返回 Java 類對象。
IsInstanceOf
jbooleanIsInstanceOf(JNIEnv *env, jobject obj,
jclass clazz);
參數:
env:JNI 接口指針。
返回值:
如果可將 obj
強製轉換為 clazz
,則返回 JNI_TRUE
。否則返回
JNI_FALSE
。NULL
對象可強製轉換為任何類。
IsSameObject
jbooleanIsSameObject(JNIEnv *env, jobject ref1,
jobject ref2);
測試兩個引用是否引用同一 Java 對象。
參數:
env:JNI 接口指針。
ref2
:Java 對象。
返回值:
如果 ref1
和 ref2
引用同一 Java 對象或均為 NULL
,則返回
JNI_TRUE
。否則返回 JNI_FALSE
。
訪問對象的域
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 類對象。
返回值:
域 ID。如果操作失敗,則返回NULL
。
拋出:
NoSuchFieldError:如果找不到指定的域。
ExceptionInInitializerError
:如果由於異常而導致類初始化程序失敗。
Get<type>Field 例程
NativeTypeGet<type>Field(JNIEnv*env, jobject obj,
jfieldID fieldID);
該訪問器例程係列返回對象的實例(非靜態)域的值。要訪問的域由通過調用GetFieldID()
而得到的域 ID 指定。
下表說明了 Get<type>Field 例程名及結果類型。應將 Get<type>Field 中的 type 替換為域的 Java 類型(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地類型。
表 4-1 Get<type>Field 訪問器例程係列 |
|
參數:
env:JNI 接口指針。
返回值:
域的內容。
Set<type>Field 例程
voidSet<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID,
NativeType value);
該訪問器例程係列設置對象的實例(非靜態)域的值。要訪問的域由通過調用SetFieldID()
而得到的域 ID 指定。
下表說明了 Set<type>Field 例程名及結果類型。應將 Set<type>Field 中的 type 替換為域的 Java 類型(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地類型。
表4-2 Set<type>Field 訪問器例程係列 |
|
參數:
env:JNI 接口指針。
調用實例方法
GetMethodID
jmethodIDGetMethodID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
返回類或接口實例(非靜態)方法的方法 ID。方法可在某個 clazz
的超類中定義,也可從 clazz
繼承。該方法由其名稱和簽名決定。
GetMethodID()
可使未初始化的類初始化。
要獲得構造函數的方法 ID,應將 <init>
作為方法名,同時將 void
(V
) 作為返回類型。
參數:
env:JNI 接口指針。
返回值:
方法 ID,如果找不到指定的方法,則為 NULL
。
拋出:
NoSuchMethodError:如果找不到指定方法。
ExceptionInInitializerError
:如果由於異常而導致類初始化程序失敗。
Call<type>Method 例程
Call<type>MethodA 例程
Call<type>MethodV 例程
NativeTypeCall<type>Method(JNIEnv*env, jobject obj,
jmethodID methodID, ...);
NativeTypeCall<type>MethodA(JNIEnv *env, jobject obj,
jmethodID methodID, jvalue *args);
NativeTypeCall<type>MethodV(JNIEnv *env, jobject obj,
jmethodID methodID, va_list args);
這三個操作的方法用於從本地方法調用Java 實例方法。它們的差別僅在於向其所調用的方法傳遞參數時所用的機製。
這三個操作將根據所指定的方法 ID 調用 Java 對象的實例(非靜態)方法。
參數 methodID
必須通過調用
GetMethodID()
來獲得。
當這些函數用於調用私有方法和構造函數時,方法 ID 必須從 obj
的真實類派生而來,而不應從其某個超類派生。
Call<type>Method例程
編程人員應將要傳給方法的所有參數緊跟著放在 methodID
參數之後。Call<type>Method 例程接受這些參數並將其傳給編程人員所要調用的 Java 方法。
Call<type>MethodA 例程
編程人員應將要傳給方法的所有參數放在緊跟在 methodID
參數之後的 jvalues
類型數組 args 中。Call<type>MethodA routine 接受這些數組中的參數並將其傳給編程人員所要調用的 Java 方法。
Call<type>MethodV例程
編程人員將方法的所有參數放在緊跟著在 methodID
參數之後的 va_list
類型參數變量中。Call<type>MethodV routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。
下表根據結果類型說明了各個方法調用例程。用戶應將Call<type>Method 中的 type 替換為所調用方法的 Java 類型(或使用表中的實際方法調用例程名),同時將 NativeType 替換為該例程相應的本地類型。
表 4-3 實例方法調用例程 |
|
|
|
參數:
env:JNI 接口指針。
Call<type>Method例程的其它參數:
要傳給 Java 方法的參數。
Call<type>MethodA例程的其它參數:
args:參數數組。
Call<type>MethodV例程的其它參數:
args:參數的 va_list。
返回值:
返回調用 Java 方法的結果。
拋出:
執行 Java 方法時拋出的異常。
CallNonvirtual<type>Method 例程
CallNonvirtual<type>MethodA 例程
CallNonvirtual<type>MethodV 例程
NativeTypeCallNonvirtual<type>Method(JNIEnv *env, jobject obj,
jclass clazz, jmethodID methodID, ...);
NativeTypeCallNonvirtual<type>MethodA(JNIEnv *env, jobject obj,
jclass clazz, jmethodID methodID, jvalue *args);
NativeTypeCallNonvirtual<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例程
編程人員應將要傳給方法的所有參數緊跟著放在 methodID
參數之後。CallNonvirtual<type>Method routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。
CallNonvirtual<type>MethodA例程
編程人員應將要傳給方法的所有參數放在緊跟在 methodID
參數之後的 jvalues
類型數組 args 中。CallNonvirtual<type>MethodAroutine 接受這些數組中的參數並將其傳給編程人員所要調用的 Java 方法。
CallNonvirtual<type>MethodV例程
編程人員應將要傳給方法的所有參數放在緊跟在 methodID
參數之後的 va_list
類型參數 args 中。CallNonvirtualMethodV routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。
下表根據結果類型說明了各個方法調用例程。用戶應將CallNonvirtual<type>Method 中的 type 替換為所調用方法的 Java 類型(或使用表中的實際方法調用例程名),同時將 NativeType 替換為該例程相應的本地類型。
參數:
env:JNI 接口指針。
clazz:
Java 類。
CallNonvirtual<type>Method例程的其它參數:
要傳給 Java 方法的參數。
CallNonvirtual<type>MethodA例程的其它參數:
args:參數數組。
CallNonvirtual<type>MethodV例程的其它參數:
args:參數的 va_list
。
返回值:
調用 Java 方法的結果。
拋出:
執行 Java 方法時所拋出的異常。
訪問靜態域
GetStaticFieldID
jfieldIDGetStaticFieldID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
返回類的靜態域的域 ID。域由其名稱和簽名指定。GetStatic<type>Field 和 SetStatic<type>Field 訪問器函數係列使用域 ID 檢索靜態域。
GetStaticFieldID()
將未初始化的類初始化。
參數:
env:JNI 接口指針。
返回值:
域 ID。如果找不到指定的靜態域,則為 NULL
。
拋出:
NoSuchFieldError:如果找不到指定的靜態域。
ExceptionInInitializerError
:如果由於異常而導致類初始化程序失敗。
GetStatic<type>Field 例程
NativeTypeGetStatic<type>Field(JNIEnv*env, jclass clazz,
jfieldID fieldID);
該訪問器例程係列返回對象的靜態域的值。要訪問的域由通過調用GetStaticFieldID()
而得到的域 ID 指定。
下表說明了 GetStatic<type>Field 例程名及結果類型。應將 GetStatic<type>Field 中的 type 替換為域的 Java 類型(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地類型。
表 4-5 GetStatic<type>Field 訪問器例程係列 |
|
參數:
env:JNI 接口指針。
返回值:
靜態域的內容。
SetStatic<type>Field 例程
voidSetStatic<type>Field(JNIEnv *env, jclass clazz,
jfieldID fieldID,
NativeType value);
該訪問器例程係列設置對象的靜態域的值。要訪問的域由通過調用GetStaticFieldID()
而得到的域 ID 指定。
下表說明了 SetStatic<type>Field 例程名及結果類型。應將 SetStatic<type>Field 中的 type 替換為域的 Java 類型(或使用表中的某個實際例程名),然後將NativeType 替換為該例程對應的本地類型。
表4-6 SetStatic<type>Field 訪問器例程係列 |
|
參數:
env:JNI 接口指針。
clazz:Java 類對象。
調用靜態方法
GetStaticMethodID
jmethodIDGetStaticMethodID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
GetStaticMethodID()
將未初始化的類初始化。
參數:
env:JNI 接口指針。
返回值:
方法 ID,如果操作失敗,則為 NULL
。
拋出:
NoSuchMethodError:如果找不到指定的靜態方法。
ExceptionInInitializerError
:如果由於異常而導致類初始化程序失敗。
CallStatic<type>Method 例程
CallStatic<type>MethodA 例程
CallStatic<type>MethodV 例程
NativeTypeCallStatic<type>Method(JNIEnv*env, jclass clazz,
jmethodID methodID, ...);
NativeTypeCallStatic<type>MethodA(JNIEnv *env, jclass clazz,
jmethodID methodID, jvalue *args);
NativeTypeCallStatic<type>MethodV(JNIEnv *env, jclass clazz,
jmethodID methodID, va_list args);
這些操作將根據指定的方法 ID 調用 Java 對象的靜態方法。methodID
參數必須通過調用GetStaticMethodID()
得到。
CallStatic<type>Method例程
編程人員應將要傳給方法的所有參數緊跟著放在 methodID
參數之後。 CallStatic<type>Method routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。
CallStatic<type>MethodA 例程
編程人員應將要傳給方法的所有參數放在緊跟在 methodID
參數之後的 jvalues
類型數組 args 中。CallStaticMethodA routine 接受這些數組中的參數並將其傳給編程人員所要調用的 Java 方法。
CallStatic<type>MethodV例程
編程人員應將要傳給方法的所有參數放在緊跟在 methodID
參數之後的 va_list
類型參數 args 中。CallStaticMethodV routine 接受這些參數並將其傳給編程人員所要調用的 Java 方法。
下表根據結果類型說明了各個方法調用例程。用戶應將CallStatic<type>Method 中的 type 替換為所調用方法的 Java 類型(或使用表中的實際方法調用例程名),同時將 NativeType 替換為該例程相應的本地類型。
參數:
env:JNI 接口指針。
CallStatic<type>Method例程的其它參數:
要傳給靜態方法的參數。
CallStatic<type>MethodA例程的其它參數:
args:參數數組。
CallStatic<type>MethodV例程的其它參數:
args:參數的 va_list
。
返回值:
返回調用靜態 Java 方法的結果。
拋出:
執行 Java 方法時拋出的異常。
最後更新:2017-04-02 06:52:01