JNI接口函數

對象操作

 

AllocObject

jobject  AllocObject(JNIEnv *env, jclass clazz);

分配新 Java 對象而不調用該對象的任何構造函數。返回該對象的引用。

clazz 參數務必不要引用數組類。

參數:

env:JNI 接口指針。

clazz:Java 類對象。

返回值:

返回 Java 對象。如果無法構造該對象,則返回NULL

拋出:

InstantiationException:如果該類爲一個接口或抽象類。

OutOfMemoryError:如果系統內存不足。

 

NewObject
NewObjectA
NewObjectV

jobject  NewObject(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

jclass  GetObjectClass(JNIEnv *env, jobject obj);

返回對象的類。

參數:

env:JNI 接口指針。

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

返回值:

返回 Java 類對象。

 

IsInstanceOf

jboolean  IsInstanceOf(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 對象。

返回值:

如果 ref1 和 ref2 引用同一 Java 對象或均爲 NULL,則返回 JNI_TRUE。否則返回 JNI_FALSE


訪問對象的域

 

GetFieldID

jfieldID   GetFieldID(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 例程

NativeType   Get<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 例程

void   Set<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

jmethodID  GetMethodID(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 例程

NativeType   Call<type>Method(JNIEnv*env, jobject obj, 
jmethodID methodID, ...);

NativeType  Call<type>MethodA(JNIEnv *env, jobject obj, 
jmethodID methodID, 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例程

編程人員應將要傳給方法的所有參數緊跟着放在 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 例程

NativeType    CallNonvirtual<type>Method(JNIEnv *env, jobject obj, 
jclass clazz, jmethodID methodID, ...);

NativeType   CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, 
jclass clazz, jmethodID methodID, 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例程

編程人員應將要傳給方法的所有參數緊跟着放在 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

jfieldID   GetStaticFieldID(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 例程

NativeType   GetStatic<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 例程

void    SetStatic<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

jmethodID   GetStaticMethodID(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 例程

NativeType   CallStatic<type>Method(JNIEnv*env, jclass clazz,
jmethodID methodID, ...);

NativeType   CallStatic<type>MethodA(JNIEnv *env, jclass clazz,
jmethodID methodID, jvalue *args);

NativeType   CallStatic<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 方法時拋出的異常。

發佈了27 篇原創文章 · 獲贊 12 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章