閱讀762 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Java 本地接口規範》- JNI 函數(二)

對象操作

 

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 對象。

返回值:

如果 ref1ref2 引用同一 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 類對象。

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

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

返回值:

域 ID。如果操作失敗,則返回NULL

拋出:

NoSuchFieldError:如果找不到指定的域。

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

OutOfMemoryError:如果係統內存不足。

 

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 訪問器例程係列

Get<type>Field 例程名

本地類型

GetObjectField()

jobject

GetBooleanField()

jboolean

GetByteField()

jbyte

GetCharField()

jchar

GetShortField()

jshort

GetIntField()

jint

GetLongField()

jlong

GetFloatField()

jfloat

GetDoubleField()

jdouble

參數:

env:JNI 接口指針。

obj:Java 對象(不能為 NULL)。

fieldID:有效的域 ID。

返回值:

域的內容。

 

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 訪問器例程係列

Set<type>Field 例程名

本地類型

SetObjectField()

jobject

SetBooleanField()

jboolean

SetByteField()

jbyte

SetCharField()

jchar

SetShortField()

jshort

SetIntField()

jint

SetLongField()

jlong

SetFloatField()

jfloat

SetDoubleField()

jdouble

參數:

env:JNI 接口指針。

obj:Java 對象(不能為 NULL)。

fieldID:有效的域 ID。

value:域的新值。


調用實例方法

 

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 例程
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 實例方法調用例程

Call<type>Method 例程名

本地類型

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例程的其它參數:

要傳給 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 替換為該例程相應的本地類型。

表 4-4 CallNonvirtual<type>Method 例程

CallNonvirtual<type>Method 例程名

本地類型

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例程的其它參數:

要傳給 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 接口指針。

clazz:Java 類對象。

name: 0 終結的 UTF-8 字符串中的靜態域名。 

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

返回值:

域 ID。如果找不到指定的靜態域,則為 NULL

拋出:

NoSuchFieldError:如果找不到指定的靜態域。

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

OutOfMemoryError:如果係統內存不足。

 

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 訪問器例程係列

GetStatic<type>Field 例程名

本地類型

GetStaticObjectField()

jobject

GetStaticBooleanField()

jboolean

GetStaticByteField()

jbyte

GetStaticCharField()

jchar

GetStaticShortField()

jshort

GetStaticIntField()

jint

GetStaticLongField()

jlong

GetStaticFloatField()

jfloat

GetStaticDoubleField()

jdouble

參數:

env:JNI 接口指針。

clazz:Java 類對象。

fieldID:靜態域 ID。

返回值:

靜態域的內容。

 

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 訪問器例程係列

SetStatic<type>Field 例程名

本地類型

SetStaticObjectField()

jobject

SetStaticBooleanField()

jboolean

SetStaticByteField()

jbyte

SetStaticCharField()

jchar

SetStaticShortField()

jshort

SetStaticIntField()

jint

SetStaticLongField()

jlong

SetStaticFloatField()

jfloat

SetStaticDoubleField()

jdouble

參數:

env:JNI 接口指針。

clazz:Java 類對象。

fieldID:靜態域 ID。

value:域的新值。


調用靜態方法

 

GetStaticMethodID

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

返回類的靜態方法的方法 ID。方法由其名稱和簽名指定。

GetStaticMethodID() 將未初始化的類初始化。

參數:

env:JNI 接口指針。

clazz:Java 類對象。

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

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

返回值:

方法 ID,如果操作失敗,則為 NULL

拋出:

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

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

OutOfMemoryError:如果係統內存不足。

 

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() 得到。

方法 ID 必須從 clazz 派生,而不能從其超類派生。

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 替換為該例程相應的本地類型。

表 4-7 CallStatic<type>Method 調用例程

CallStatic<type>Method 例程名

本地類型

CallStaticVoidMethod() CallStaticVoidMethodA() CallStaticVoidMethodV()

void

CallStaticObjectMethod() CallStaticObjectMethodA() CallStaticObjectMethodV()

jobject

CallStaticBooleanMethod() CallStaticBooleanMethodA() CallStaticBooleanMethodV()

jboolean

CallStaticByteMethod() CallStaticByteMethodA() CallStaticByteMethodV()

jbyte

CallStaticCharMethod() CallStaticCharMethodA() CallStaticCharMethodV()

jchar

CallStaticShortMethod() CallStaticShortMethodA() CallStaticShortMethodV()

jshort

CallStaticIntMethod() CallStaticIntMethodA() CallStaticIntMethodV()

jint

CallStaticLongMethod() CallStaticLongMethodA() CallStaticLongMethodV()

jlong

CallStaticFloatMethod() CallStaticFloatMethodA() CallStaticFloatMethodV()

jfloat

CallStaticDoubleMethod() CallStaticDoubleMethodA() CallStaticDoubleMethodV()

jdouble

參數:

env:JNI 接口指針。

clazz:Java 類對象。

methodID:靜態方法 ID。

CallStatic<type>Method例程的其它參數:

要傳給靜態方法的參數。

CallStatic<type>MethodA例程的其它參數:

args:參數數組。

CallStatic<type>MethodV例程的其它參數:

args:參數的 va_list

返回值:

返回調用靜態 Java 方法的結果。

拋出:

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

最後更新:2017-04-02 06:52:01

  上一篇:go Format String Vulnerability lab實驗
  下一篇:go isalnum &lt;ctype.h&gt; &lt;cctype&gt;