花了幾天時(shí)間研究了下JNI,基本上知道如何使用了。照我的觀點(diǎn)JNI還是不難的,難得只是我們一份嘗試的心。 學(xué)習(xí)過(guò)程中,
發(fā)現(xiàn)關(guān)于JNI函數(shù)資料真的很少,所謂“工欲善其事,便先利其器”,整理出了這份資料,希望能幫助你克服JNI學(xué)習(xí)的坎。
主要資料來(lái)源: 百度文庫(kù)的**《**[**JNI常用函數(shù)》**](http://wenku.baidu.com/view/2853bc262f60ddccda38a00d.html) 。
同時(shí)對(duì)其加以了補(bǔ)充 。
要素 :1、 該函數(shù)大全是基于C語(yǔ)言方式的,對(duì)于C++方式可以直接轉(zhuǎn)換 ,例如,對(duì)于生成一個(gè)jstring類型的方法轉(zhuǎn)換分別如下:
C編程環(huán)境中使用方法為:(env) ->NewStringUTF(env , "123") ;*
C++編程環(huán)境中(例如,VC下)則是:** env ->NewStringUTF( "123") ; ** (使用起來(lái)更簡(jiǎn)單)
2、關(guān)于下列有些函數(shù)中:*isCopy 的說(shuō)明,例如,如下函數(shù):
const char* **GetStringUTFChars**(JNIEnv*env, jstring string, jboolean *isCopy);
對(duì)第三個(gè)參數(shù) jboolean *isCopy說(shuō)明如下:
當(dāng)從JNI函數(shù)GetStringUTFChars函數(shù)中返回得到字符串B時(shí),如果B是原始字符串[Java](http://lib.csdn.net/base/javase).lang.String的一份拷貝,
則isCopy 被賦值為JNI_TRUE。如果B是和原始字符串指向的是JVM中的**同一份數(shù)據(jù)**,則isCopy 被賦值為JNI_FALSE。
當(dāng)isCopy 為JNI_FALSE時(shí),本地代碼絕不能修改字符串的內(nèi)容,否則JVM中的原始字符串也會(huì)被修改,這會(huì)打破Java語(yǔ)言
中字符串不可變的規(guī)則。
通常,我們不必關(guān)心JVM是否會(huì)返回原始字符串的拷貝,只需要為isCopy傳遞NULL作為參數(shù) 。
---- 以上內(nèi)容來(lái)自 **《JNI編程指南》**
**一、類操作 **
jclass **DefineClass **(JNIEnv *env, jobject loader, const jbyte *buf , jsize bufLen);
功能:從原始類數(shù)據(jù)的緩沖區(qū)中加載類。
參數(shù): env JNI 接口指針。
loader 分派給所定義的類的類加載器。
buf 包含 .class 文件數(shù)據(jù)的緩沖區(qū)。
bufLen 緩沖區(qū)長(zhǎng)度。
返回值:返回 Java 類對(duì)象。如果出錯(cuò)則返回NULL。
拋出: ClassFormatError 如果類數(shù)據(jù)指定的類無(wú)效。
ClassCircularityError 如果類或接口是自身的超類或超接口。
OutOfMemoryError 如果系統(tǒng)內(nèi)存不足。
jclass **FindClass **(JNIEnv *env, const char *name);
功能: 該函數(shù)用于加載本地定義的類。它將搜索由CLASSPATH 環(huán)境變量為具有指定名稱的類所指定的目錄和 zip文件。
參數(shù):env JNI 接口指針。
name 類全名(即包名后跟類名,之間由"/"分隔).如果該名稱以“[(數(shù)組簽名字符)打頭,則返回一個(gè)數(shù)組類。
返回值:返回類對(duì)象全名。如果找不到該類,則返回 NULL。
拋出: ClassFormatError 如果類數(shù)據(jù)指定的類無(wú)效。
ClassCircularityError 如果類或接口是自身的超類或超接口。
NoClassDefFoundError 如果找不到所請(qǐng)求的類或接口的定義。
OutOfMemoryError 如果系統(tǒng)內(nèi)存不足。
jclass **GetObjectClass **(JNIEnv *env, jobject obj);
功能:通過(guò)對(duì)象獲取這個(gè)類。該函數(shù)比較簡(jiǎn)單,唯一注意的是對(duì)象不能為NULL,否則獲取的class肯定返回也為NULL。
參數(shù): env JNI 接口指針。
obj Java 類對(duì)象實(shí)例。
jclass **GetSuperclass **(JNIEnv *env, jclass clazz);
功能:獲取父類或者說(shuō)超類 。 如果 clazz 代表類class而非類 object,則該函數(shù)返回由 clazz 所指定的類的超類。 如果 clazz
指定類 object 或代表某個(gè)接口,則該函數(shù)返回NULL。
參數(shù): env JNI 接口指針。
clazz Java 類對(duì)象。
返回值: 由 clazz 所代表的類的超類或 NULL。
jboolean **IsAssignableFrom **(JNIEnv *env, jclass clazz1, jclass clazz2);
功能:確定 clazz1 的對(duì)象是否可安全地強(qiáng)制轉(zhuǎn)換為clazz2。
參數(shù): env JNI 接口指針。
clazz1 第一個(gè)類參數(shù)。
clazz2 第二個(gè)類參數(shù)。
返回值: 下列某個(gè)情況為真時(shí)返回 JNI_TRUE:
1、 第一及第二個(gè)類參數(shù)引用同一個(gè) Java 類。
2、 第一個(gè)類是第二個(gè)類的子類。
3、 第二個(gè)類是第一個(gè)類的某個(gè)接口。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
二**、異常操作 **
jint Throw(JNIEnv *env, jthrowable obj);
功能:拋出 java.lang.Throwable 對(duì)象。
參數(shù): env JNI 接口指針。
obj java.lang.Throwable 對(duì)象。
返回值: 成功時(shí)返回 0,失敗時(shí)返回負(fù)數(shù)。
拋出: java.lang.Throwable 對(duì)象 obj。
jint **ThrowNew **(JNIEnv *env , jclass clazz, const char *message);
功能:利用指定類的消息(由 message 指定)構(gòu)造異常對(duì)象并拋出該異常。
參數(shù): env JNI 接口指針。
clazz java.lang.Throwable 的子類。
message 用于構(gòu)造java.lang.Throwable對(duì)象的消息。
返回值: 成功時(shí)返回 0,失敗時(shí)返回負(fù)數(shù)。
拋出: 新構(gòu)造的 java.lang.Throwable 對(duì)象。
jthrowable **ExceptionOccurred **(JNIEnv *env);
功能:確定是否某個(gè)異常正被拋出。在平臺(tái)相關(guān)代碼調(diào)用 ExceptionClear() 或 Java 代碼處理該異常前,異常將始終保持
拋出狀態(tài)。
參數(shù): env JNI 接口指針。
返回值: 返回正被拋出的異常對(duì)象,如果當(dāng)前無(wú)異常被拋出,則返回NULL。
void **ExceptionDescribe **(JNIEnv *env);
功能:將異常及堆棧的回溯輸出到系統(tǒng)錯(cuò)誤報(bào)告信道(例如 stderr)。該例程可便利調(diào)試操作。
參數(shù):env JNI 接口指針。
void **ExceptionClear **(JNIEnv *env);
功能:清除當(dāng)前拋出的任何異常。如果當(dāng)前無(wú)異常,則此例程不產(chǎn)生任何效果。
參數(shù): env JNI 接口指針。
void **FatalError **(JNIEnv *env, const char *msg);
功能:拋出致命錯(cuò)誤并且不希望虛擬機(jī)進(jìn)行修復(fù)。該函數(shù)無(wú)返回值。
參數(shù): env JNI 接口指針。
msg 錯(cuò)誤消息。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
三、全局及局部引用
jobject **NewGlobalRef **(JNIEnv *env, jobject obj);
功能:創(chuàng)建 obj 參數(shù)所引用對(duì)象的新全局引用。obj 參數(shù)既可以是全局引用,也可以是局部引用。全局引用通過(guò)調(diào)用
DeleteGlobalRef() 來(lái)顯式撤消。
參數(shù):env JNI 接口指針。
obj 全局或局部引用。
返回值: 返回全局引用。如果系統(tǒng)內(nèi)存不足則返回 NULL。
void **DeleteGlobalRef **(JNIEnv *env, jobject globalRef);
功能: 刪除 globalRef 所指向的全局引用。
參數(shù): env JNI 接口指針。
globalRef 全局引用。
void **DeleteLocalRef **(JNIEnv *env, jobject localRef);
功能: 刪除 localRef所指向的局部引用。
參數(shù): env JNI 接口指針。
localRef 局部引用。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**四、對(duì)象操作 **
jobject **AllocObject **(JNIEnv *env, jclass clazz);
功能:分配新 Java 對(duì)象而不調(diào)用該對(duì)象的任何構(gòu)造函數(shù)。返回該對(duì)象的引用。clazz 參數(shù)務(wù)必不要引用數(shù)組類。
參數(shù): env JNI 接口指針。
clazz Java 類對(duì)象。
返回值: 返回 Java 對(duì)象。如果無(wú)法構(gòu)造該對(duì)象,則返回NULL。
拋出: InstantiationException:如果該類為一個(gè)接口或抽象類。
OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
jobject **NewObject **(JNIEnv *env , jclass clazz, jmethodID methodID, ...); //參數(shù)附加在函數(shù)后面
jobject **NewObjectA **(JNIEnv env , jclassclazz, jmethodID methodID, jvalue args); //參數(shù)以指針形式附加
jobjec tNewObjectV **(JNIEnv *env , jclassclazz, jmethodID methodID, va_list args); //參數(shù)以"鏈表"形式附加
功能:構(gòu)造新 Java 對(duì)象。方法 ID指示應(yīng)調(diào)用的構(gòu)造函數(shù)方法。注意:該 ID特指該類class的構(gòu)造函數(shù)ID , 必須通過(guò)調(diào)用
GetMethodID() 獲得,且調(diào)用時(shí)的方法名必須為 <init>,而返回類型必須為 void (V)。clazz參數(shù)務(wù)必不要引用數(shù)組類。
參數(shù): env JNI 接口指針。
clazz Java 類對(duì)象。
methodID 構(gòu)造函數(shù)的方法 ID。
NewObject 的其它參數(shù): 傳給構(gòu)造函數(shù)的參數(shù),可以為空 。
NewObjectA 的其它參數(shù): args:傳給構(gòu)造函數(shù)的參數(shù)數(shù)組。
NewObjectV 的其它參數(shù): args:傳給構(gòu)造函數(shù)的參數(shù) va_list。
返回值: 返回 Java 對(duì)象,如果無(wú)法構(gòu)造該對(duì)象,則返回NULL。
拋出: InstantiationException 如果該類為接口或抽象類。
OutOfMemoryError 如果系統(tǒng)內(nèi)存不足。
構(gòu)造函數(shù)拋出的任何異常。
jclass **GetObjectClass **(JNIEnv *env, jobject obj);
功能:返回對(duì)象的類。
參數(shù): env JNI 接口指針。
obj Java 對(duì)象(不能為 NULL)。
返回值: 返回 Java 類對(duì)象。
jboolean **IsInstanceOf **(JNIEnv *env, jobject obj, jclass clazz);
功能:測(cè)試對(duì)象是否為某個(gè)類的實(shí)例。
參數(shù): env JNI 接口指針。
obj Java 對(duì)象。
clazz Java 類對(duì)象。
返回值:如果可將 obj 強(qiáng)制轉(zhuǎn)換為 clazz,則返回 JNI_TRUE。否則返回 JNI_FALSE。NULL 對(duì)象可強(qiáng)制轉(zhuǎn)換為任何類。
jboolean**IsSameObject **(JNIEnv *env, jobjectref1, jobject ref2);
功能:測(cè)試兩個(gè)引用是否引用同一 Java 對(duì)象。
參數(shù): env JNI 接口指針。
ref1 Java 對(duì)象。
ref2 Java 對(duì)象。
返回值: 如果 ref1 和 ref2 引用同一 Java 對(duì)象或均為 NULL,則返回 JNI_TRUE。否則返回 JNI_FALSE。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
五、 字符串操作
jstring **NewString **(JNIEnv *env, const jchar *unicodeChars, jsize len);
功能:利用 Unicode 字符數(shù)組構(gòu)造新的 java.lang.String 對(duì)象。
參數(shù): env:JNI 接口指針。
unicodeChars:指向 Unicode 字符串的指針。
len:Unicode 字符串的長(zhǎng)度。
返回值: Java 字符串對(duì)象。如果無(wú)法構(gòu)造該字符串,則為NULL。
拋出: OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
jsize **GetStringLength **(JNIEnv *env, jstring string);
功能:返回 Java 字符串的長(zhǎng)度(Unicode 字符數(shù))。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
返回值: Java 字符串的長(zhǎng)度。
const jchar * **GetStringChars *(JNIEnvenv, jstring string, jboolean *isCopy);
功能:返回指向字符串的 Unicode 字符數(shù)組的指針。該指針在調(diào)用 ReleaseStringchars() 前一直有效。
如果 isCopy 非空,則在復(fù)制完成后將 *isCopy 設(shè)為 JNI_TRUE。如果沒(méi)有復(fù)制,則設(shè)為JNI_FALSE。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
isCopy:指向布爾值的指針。
返回值: 指向 Unicode 字符串的指針,如果操作失敗,則返回NULL。
void **ReleaseStringChars **(JNIEnv *env, jstring string, const jchar *chars);
功能:通知虛擬機(jī)平臺(tái)相關(guān)代碼無(wú)需再訪問(wèn) chars。參數(shù)chars 是一個(gè)指針,可通過(guò) GetStringChars() 從 string 獲得。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
chars:指向 Unicode 字符串的指針。
jstring **NewStringUTF **(JNIEnv *env, const char *bytes);
功能:利用 UTF-8 字符數(shù)組構(gòu)造新 java.lang.String 對(duì)象。
參數(shù): env:JNI 接口指針。如果無(wú)法構(gòu)造該字符串,則為 NULL。
bytes:指向 UTF-8 字符串的指針。
返回值:Java 字符串對(duì)象。如果無(wú)法構(gòu)造該字符串,則為NULL。
拋出: OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
jsize **GetStringUTFLength **(JNIEnv *env, jstring string);
功能:以字節(jié)為單位返回字符串的 UTF-8 長(zhǎng)度。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
返回值: 返回字符串的 UTF-8
const char* **GetStringUTFChars *(JNIEnvenv, jstring string, jboolean isCopy);
功能:返回指向字符串的 UTF-8 字符數(shù)組的指針。該數(shù)組在被ReleaseStringUTFChars() 釋放前將一直有效。 如果 isCopy
不是 NULL,isCopy 在復(fù)制完成后即被設(shè)為 JNI_TRUE。如果未復(fù)制,則設(shè)為 JNI_FALSE。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
isCopy:指向布爾值的指針。
返回值: 指向 UTF-8 字符串的指針。如果操作失敗,則為 NULL。
void **ReleaseStringUTFChars **(JNIEnv *env, jstring string, const char *utf);
功能:通知虛擬機(jī)平臺(tái)相關(guān)代碼無(wú)需再訪問(wèn) utf。utf 參數(shù)是一個(gè)指針,可利用 GetStringUTFChars() 獲得。
參數(shù): env:JNI 接口指針。
string:Java 字符串對(duì)象。
utf:指向 UTF-8 字符串的指針。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**六、數(shù)組操作 **
jsize **GetArrayLength **(JNIEnv *env, jarray array);
功能:返回?cái)?shù)組中的元素?cái)?shù)。
參數(shù): env:JNI 接口指針。
array:Java 數(shù)組對(duì)象。
返回值: 數(shù)組的長(zhǎng)度。
jarray **NewObjectArray **(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);
功能:構(gòu)造新的數(shù)組,它將保存類 elementClass 中的對(duì)象。所有元素初始值均設(shè)為 initialElement。
參數(shù): env:JNI 接口指針。
length:數(shù)組大小。
elementClass:數(shù)組元素類。
initialElement:初始值。 可以為NULL 。
返回值:Java 數(shù)組對(duì)象。如果無(wú)法構(gòu)造數(shù)組,則為 NULL。
拋出: OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
說(shuō)明: 使用該函數(shù)時(shí),為了便于易操作性,我們一般可以用jobjectArray數(shù)組類型或得返回值,例如:
jobjectArray objArray = env->NewObjectArray ( );
//操作該對(duì)象
env->**GetObjectArrayElement **(objArray, 0);//獲得該object數(shù)組在索引0處的值 ,(可以強(qiáng)制轉(zhuǎn)換類型).
jobject **GetObjectArrayElement **(JNIEnv *env, jobjectArray array, jsize index);
功能:返回 Object 數(shù)組的元素。
參數(shù): env:JNI 接口指針。
array:Java 數(shù)組。
index:數(shù)組下標(biāo)。
返回值: Java 對(duì)象。
拋出: ArrayIndexOutOfBoundsException:如果 index 不是數(shù)組中的有效下標(biāo)。
void **SetObjectArrayElement **(JNIEnv *env, jobjectArray array, jsize index, jobject value);
功能:設(shè)置 Object 數(shù)組的元素。
參數(shù): env:JNI 接口指針。
array:Java 數(shù)組。
index:數(shù)組下標(biāo)。
value:新值。
拋出: ArrayIndexOutOfBoundsException:如果 index 不是數(shù)組中的有效下標(biāo)。
ArrayStoreException:如果 value 的類不是數(shù)組元素類的子類。
** New<PrimitiveType>Array方法類型**
NativeType **New<PrimitiveType>Array **(JNIEnv env, ArrayType array, jbooleanisCopy);
說(shuō)明: 用于構(gòu)造新基本類型數(shù)組對(duì)象的一系列操作。下表說(shuō)明了特定的基本類型數(shù)組構(gòu)造函數(shù)。用戶應(yīng)把
New<PrimitiveType>Array 替換為某個(gè)實(shí)際的基本類型數(shù)組構(gòu)造函數(shù)例程名(見(jiàn)下表),然后將 ArrayType替換為
該例程相應(yīng)的數(shù)組類型。
參數(shù): env : JNI 接口指針。
length:數(shù)組長(zhǎng)度。
返回值: Java 數(shù)組。如果無(wú)法構(gòu)造該數(shù)組,則為 NULL。
New<PrimitiveType>Array 方法組 數(shù)組類型
NewBooleanArray() jbooleanArray
NewByteArray() jbyteArray
NewCharArray() jcharArray
NewShortArray() jshortArray
NewIntArray() jintArray
NewLongArray() jlongArray
NewFloatArray() jfloatArray
NewDoubleArray() jdoubleArray
** Get<PrimitiveType>ArrayElements 方法類型 **
NativeType ***Get<PrimitiveType>ArrayElements *(JNIEnv env, ArrayType array, jbooleanisCopy);
說(shuō)明:一組返回基本類型數(shù)組體的函數(shù)。結(jié)果在調(diào)用相應(yīng)的 Release<PrimitiveType>ArrayElements()函數(shù)前將一直有效。
由于返回的數(shù)組可能是 Java 數(shù)組的副本,因此對(duì)返回?cái)?shù)組的更改不必在基本類型數(shù)組中反映出來(lái),直到調(diào)用了
Release<PrimitiveType>ArrayElements()。 如果 isCopy 不是 NULL,isCopy 在復(fù)制完成后即被設(shè)為 JNI_TRUE。如果
未復(fù)制,則設(shè)為 JNI_FALSE。
使用說(shuō)明:
將 Get<PrimitiveType>ArrayElements 替換為表中某個(gè)實(shí)際的基本類型元素訪問(wèn)器例程名。
將 ArrayType 替換為對(duì)應(yīng)的數(shù)組類型。
將 NativeType 替換為該例程對(duì)應(yīng)的本地類型。
參數(shù): env:JNI 接口指針。
array:Java 字符串對(duì)象。
isCopy:指向布爾值的指針。
返回值: 返回指向數(shù)組元素的指針,如果操作失敗,則為 NULL。
不管布爾數(shù)組在 Java 虛擬機(jī)中如何表示,GetBooleanArrayElements() 將始終返回一個(gè) jbooleans 類型的指針,其中每一
字節(jié)代表一個(gè)元素(開(kāi)包表示)。內(nèi)存中將確保所有其它類型。
Get<PrimitiveType>ArrayElements 例程 數(shù)組類型 本地類型
GetBooleanArrayElements() jbooleanArray jboolean
GetByteArrayElements() jbyteArray jbyte
GetCharArrayElements() jcharArray jchar
GetShortArrayElements() jshortArray jshort
GetIntArrayElements() jintArray jint
GetLongArrayElements() jlongArray jlong
GetFloatArrayElements() jfloatArray jfloat
GetDoubleArrayElements() jdoubleArray jdouble
** Release<PrimitiveType>ArrayElements 方法類型 **
void **Release<PrimitiveType>ArrayElements **(JNIEnv *env, ArrayType array, NativeType *elems,jint mode);
功能:通知虛擬機(jī)平臺(tái)相關(guān)代碼無(wú)需再訪問(wèn) elems 的一組函數(shù)。elems 參數(shù)是一個(gè)通過(guò)使用對(duì)應(yīng)的
Get<PrimitiveType>ArrayElements() 函數(shù)由 array 導(dǎo)出的指針。必要時(shí),該函數(shù)將把對(duì) elems 的修改復(fù)制回基本
類型數(shù)組。mode參數(shù)將提供有關(guān)如何釋放數(shù)組緩沖區(qū)的信息。如果elems 不是 array 中數(shù)組元素的副本,mode將無(wú)效。
否則,mode 將具有下表所述的功能:
模式 動(dòng)作
0 復(fù)制回內(nèi)容并釋放elems 緩沖區(qū)
JNI_COMMIT 復(fù)制回內(nèi)容但不釋放elems 緩沖區(qū)
JNI_ABORT 釋放緩沖區(qū)但不復(fù)制回變化
多數(shù)情況下,編程人員將把“0”傳給 mode 參數(shù)以確保固定的數(shù)組和復(fù)制的數(shù)組保持一致。其它選項(xiàng)可以使編程人員進(jìn)一步
控制內(nèi)存管理,但使用時(shí)務(wù)必慎重。
使用說(shuō)明:
將 ArrayType 替換為對(duì)應(yīng)的數(shù)組類型。
將 NativeType 替換為該例程對(duì)應(yīng)的本地類型。
參數(shù): env:JNI 接口指針。
array:Java 數(shù)組對(duì)象。
elems:指向數(shù)組元素的指針。
mode:釋放模式。
Release<PrimitiveType>ArrayElements 方法組 數(shù)組類型 本地類型
ReleaseBooleanArrayElements() jbooleanArray jboolean
ReleaseByteArrayElements() jbyteArray jbyte
ReleaseCharArrayElements() jcharArray jchar
ReleaseShortArrayElements() jshortArray jshort
ReleaseIntArrayElements() jintArray jint
ReleaseLongArrayElements() jlongArray jlong
ReleaseFloatArrayElements() jfloatArray jfloat
ReleaseDoubleArrayElements() jdoubleArray jdouble
** Get<PrimitiveType>ArrayRegion 方法類型 **
void ** Get<PrimitiveType>ArrayRegion **(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
功能:將基本類型數(shù)組某一區(qū)域復(fù)制到緩沖區(qū)中的一組函數(shù)。
使用說(shuō)明:
將 Get<PrimitiveType>ArrayRegion 替換為下表的某個(gè)實(shí)際基本類型元素訪問(wèn)器例程名。
將 ArrayType 替換為對(duì)應(yīng)的數(shù)組類型。
將 NativeType 替換為該例程對(duì)應(yīng)的本地類型。
參數(shù): env:JNI 接口指針。
array:Java 指針。
start:起始下標(biāo)。
len:要復(fù)制的元素?cái)?shù)。
buf:目的緩沖區(qū)。
拋出: ArrayIndexOutOfBoundsException:如果區(qū)域中的某個(gè)下標(biāo)無(wú)效。
方法族如下:
Get<PrimitiveType>ArrayRegion方法 數(shù)組類型 本地類型
GetBooleanArrayRegion() jbooleanArray jboolean
GetByteArrayRegion() jbyteArray jbyte
GetCharArrayRegion() jcharArray jchar
GetShortArrayRegion() jshortArray jhort
GetIntArrayRegion() jintArray jint
GetLongArrayRegion() jlongArray jlong
GetFloatArrayRegion() jfloatArray jloat
GetDoubleArrayRegion() jdoubleArray jdouble
** Set<PrimitiveType>ArrayRegion 方法類型 **
void **Set<PrimitiveType>ArrayRegion **(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
功能:將基本類型數(shù)組的某一區(qū)域從緩沖區(qū)中復(fù)制回來(lái)的一組函數(shù)。
使用說(shuō)明: 將 Set<PrimitiveType>ArrayRegion 替換為表中的實(shí)際基本類型元素訪問(wèn)器例程名。
將 ArrayType 替換為對(duì)應(yīng)的數(shù)組類型。
將 NativeType 替換為該例程對(duì)應(yīng)的本地類型。
參數(shù): env:JNI 接口指針。
array: Java 數(shù)組。
start:起始下標(biāo)。
len:要復(fù)制的元素?cái)?shù)。
buf:源緩沖區(qū)。
拋出: ArrayIndexOutOfBoundsException:如果區(qū)域中的某個(gè)下標(biāo)無(wú)效。
Set<PrimitiveType>ArrayRegion 方法族 數(shù)組類型 本地類型
SetBooleanArrayRegion() jbooleanArray jboolean
SetByteArrayRegion() jbyteArray jbyte
SetCharArrayRegion() jcharArray jchar
SetShortArrayRegion() jshortArray jshort
SetIntArrayRegion() jintArray jint
SetLongArrayRegion() jlongArray jlong
SetFloatArrayRegion() jfloatArray jfloat
SetDoubleArrayRegion() jdoubleArray jdouble
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
** 六、訪問(wèn)對(duì)象的屬性和方法 **
1、實(shí)例屬性的訪問(wèn)
jfieldID **GetFieldID **(JNIEnv *env, jclass clazz, const char *name, const char *sig);
功能:返回類的實(shí)例(非靜態(tài))域的屬性 ID。該域由其名稱及簽名指定。訪問(wèn)器函數(shù)的Get<type>Field 及 Set<type>Field
系列使用域 ID 檢索對(duì)象域。GetFieldID() 不能用于獲取數(shù)組的長(zhǎng)度域。應(yīng)使用GetArrayLength()。
參數(shù): env:JNI 接口指針。
clazz:Java 類對(duì)象。
name: 該屬性的Name名稱
sig: 該屬性的域簽名。
返回值:屬性ID。如果操作失敗,則返回NULL。
拋出: NoSuchFieldError:如果找不到指定的域。
ExceptionInInitializerError:如果由于異常而導(dǎo)致類初始化程序失敗。
OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
**Get<type>Field 例程 **
NativeType **Get<type>Field *(JNIEnvenv, jobject obj, jfieldID fieldID);
功能:該訪問(wèn)器例程系列返回對(duì)象的實(shí)例(非靜態(tài))域的值。要訪問(wèn)的域由通過(guò)調(diào)用GetFieldID() 而得到的域 ID 指定。
參數(shù): env:JNI 接口指針。
obj:Java 對(duì)象(不能為 NULL)。
fieldID:有效的域 ID。
返回值: 屬性的內(nèi)容。
Get<type>Field 例程名 本地類型
GetObjectField() jobject
GetBooleanField() jboolean
GetByteField() jbyte
GetCharField() jchar
GetShortField() jshort
GetIntField() jint
GetLongField() jlong
GetFloatField() jfloat
GetDoubleField() jdouble
** Set<type>Field 方法族 **
void **Set<type>Field **(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);
功能: 該訪問(wèn)器例程系列設(shè)置對(duì)象的實(shí)例(非靜態(tài))屬性的值。要訪問(wèn)的屬性由通過(guò)調(diào)用SetFieldID() 而得到的屬性 ID指定。
參數(shù): env:JNI 接口指針。
obj:Java 對(duì)象(不能為 NULL)。
fieldID:有效的域 ID。
value:域的新值。
方法族 如下:
Set<type>Field 方法族 本地類型
SetObjectField() jobject
SetBooleanField() jboolean
SetByteField() jbyte
SetCharField() jchar
SetShortField() jshort
SetIntField() jint
SetLongField() jlong
SetFloatField() jfloat
SetDoubleField() jdouble
** 2、靜態(tài)屬性的訪問(wèn) :**也存在相同的方法,
jfieldID **GetStaticFieldID **(JNIEnv *env,**jclass clazz**, const char *name, const char *sig);
NativeType** **** GetStatic<type>Field **(JNIEnv*env,**jclass classzz **, jfieldID fieldID);
void **SetStatic<type>Field **(JNIEnv *env,**jclassclasszz**, jfieldID fieldID, NativeType value); ****
** 它們與實(shí)例屬性的唯一區(qū)別在于第二個(gè)參數(shù)jclass classzz代表的是類引用,而不是類實(shí)例。**
** 3、調(diào)用實(shí)例方法 **
jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
功能:返回類或接口實(shí)例(非靜態(tài))方法的方法 ID。方法可在某個(gè) clazz 的超類中定義,也可從 clazz 繼承。該方法由其名稱
和簽名決定。 GetMethodID() 可使未初始化的類初始化。要獲得構(gòu)造函數(shù)的方法 ID,應(yīng)將 <init> 作為方法名,同時(shí)將
void (V) 作為返回類型。
參數(shù): env:JNI 接口指針。
clazz:Java 類對(duì)象。
name:方法名。
sig:方法的簽名。
返回值: 方法 ID,如果找不到指定的方法,則為 NULL。
拋出: NoSuchMethodError:如果找不到指定方法。
ExceptionInInitializerError:如果由于異常而導(dǎo)致類初始化程序失敗。
OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。
Call<type>Method 例程 、Call<type>MethodA 例程 、Call<type>MethodV 例程
NativeType **Call<type>Method *(JNIEnven v, jobject obj , jmethodID methodID, ...); //參數(shù)附加在函數(shù)后面,
NativeType **Call<type>MethodA **(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args); //參數(shù)以指針形式附加
NativeType **Call<type>MethodV **(JNIEnv *env, jobject obj,jmethodID methodID, va_list args); //參數(shù)以"鏈表"形式附加
說(shuō)明:這三個(gè)操作的方法用于從本地方法調(diào)用Java 實(shí)例方法。它們的差別僅在于向其所調(diào)用的方法傳遞參數(shù)時(shí)所用的機(jī)制。
這三個(gè)操作將根據(jù)所指定的方法 ID 調(diào)用 Java 對(duì)象的實(shí)例(非靜態(tài))方法。參數(shù) methodID 必須通過(guò)調(diào)用 GetMethodID()
來(lái)獲得。當(dāng)這些函數(shù)用于調(diào)用私有方法和構(gòu)造函數(shù)時(shí),方法 ID 必須從obj 的真實(shí)類派生而來(lái),而不應(yīng)從其某個(gè)超類派生。
當(dāng)然,附加參數(shù)可以為空 。
參數(shù): env:JNI 接口指針。
obj:Java 對(duì)象。
methodID:方法 ID。
返回值: 返回調(diào)用 Java 方法的結(jié)果。
拋出: 執(zhí)行 Java 方法時(shí)拋出的異常。
下表根據(jù)結(jié)果類型說(shuō)明了各個(gè)方法類型。用戶應(yīng)將Call<type>Method 中的 type 替換為所調(diào)用方法的Java 類型(或使用表
中的實(shí)際方法名),同時(shí)將 NativeType 替換為該方法相應(yīng)的本地類型。省略掉了其他兩種類型。
Java層返回值 方法族 本地返回類型NativeType
返回值為void : CallVoidMethod( ) A / V (無(wú))
返回值為引用類型: CallObjectMethod( ) jobect
返回值為boolean : CallBooleanMethod ( ) jboolean
返回值為byte : CallByteMethod( ) jbyte
返回值為char : CallCharMethod( ) jchar
返回值為short CallShortMethod( ) jshort
返回值為int : CallIntMethod( ) jint
返回值為long: CallLongMethod() jlong
返回值為float : CallFloatMethod() jfloat
返回值為double: CallDoubleMethod() jdouble
** 4、調(diào)用靜態(tài)方法:**也存在如下方法群,
jfieldID **GetStaticMethodID **(JNIEnv *env,**jclass clazz**, const char *name, const char *sig);
NativeType** **** **Call<type>Method ****(JNIEnv*env,**jclass classzz **, jfieldID fieldID);
** 它們與于實(shí)例方法的唯一區(qū)別在于第二個(gè)參數(shù)jclass classzz代表的是類引用,而不是類實(shí)例。**
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**七、注冊(cè)本地方法 **
jint **RegisterNatives **(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
功能:向 clazz 參數(shù)指定的類注冊(cè)本地方法。methods 參數(shù)將指定 JNINativeMethod 結(jié)構(gòu)的數(shù)組,其中包含本地方法的名稱、
簽名和函數(shù)指針。nMethods 參數(shù)將指定數(shù)組中的本地方法數(shù)。JNINativeMethod 結(jié)構(gòu)定義如下所示:
typedef struct {
char *name;
char *signature;
void fnPtr;
} JNINativeMethod;
函數(shù)指針通常必須有下列簽名:
ReturnType (fnPtr)(JNIEnv *env, jobject objectOrClass, ...);
參數(shù): env:JNI 接口指針。
clazz:Java 類對(duì)象。
methods:類中本地方法和具體實(shí)現(xiàn)方法的映射指針。
nMethods:類中的本地方法數(shù)。
返回值: 成功時(shí)返回 "0";失敗時(shí)返回負(fù)數(shù)。
拋出: NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。
jint **UnregisterNatives **(JNIEnv *env, jclass clazz);
功能: 取消注冊(cè)類的本地方法。類將返回到鏈接或注冊(cè)了本地方法函數(shù)前的狀態(tài)。 該函數(shù)不應(yīng)在常規(guī)平臺(tái)相關(guān)代碼中使用。
相反,它可以為某些程序提供一種重新加載和重新鏈接本地庫(kù)的途徑。
參數(shù): env:JNI 接口指針。
clazz:Java 類對(duì)象。
返回值: 成功時(shí)返回“0”;失敗時(shí)返回負(fù)數(shù)。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其實(shí),JNI方面的書籍還是比較少的,建議大家看看**《JNI編程指南》,**算的上個(gè)入門書籍吧,指望你能耐心點(diǎn)看。