【转】JNI学习积累之一 ---- 常用函数大全
原文網(wǎng)址:http://blog.csdn.net/qinjuning/article/details/7595104
?本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/qinjuning
?????? ? 最近一段時(shí)間,在工作方面比較閑,分配的Bug不是很多,于是好好利用這段時(shí)間就著源代碼看了些許模塊,?主要方式
?? 還是賊看賊看代碼,?同時(shí)利用燒機(jī)的便利,加Log觀看,基本上都能弄個(gè)臉熟 。心里想著該寫點(diǎn)什么了?可是水平不夠,再加上
?? 包括很多真正實(shí)現(xiàn)地方--中間層,基本上沒(méi)看。于是乎,也就不好賣弄了。
?
????? 花了幾天時(shí)間研究了下JNI,基本上知道如何使用了。照我的觀點(diǎn)JNI還是不難的,難得只是我們一份嘗試的心。 學(xué)習(xí)過(guò)程中,
??發(fā)現(xiàn)關(guān)于JNI函數(shù)資料真的很少,所謂“工欲善其事,便先利其器”,整理出了這份資料,希望能幫助你克服JNI學(xué)習(xí)的坎。
?????
????? 主要資料來(lái)源: 百度文庫(kù)的《JNI常用函數(shù)》?。
???? ?同時(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.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)換為任何類。 ? ? ? ? ??
? ? ? ? ? ? ? ? ??? ? ? ? ?
?jbooleanIsSameObject?(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?(JNIEnv*env, 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?(JNIEnv*env, 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, jboolean*isCopy); ? ? ? ? ? ? ? ? ?
?
? ? ?說(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, jboolean*isCopy); ? ? ? ? ? ? ? ? ?
? ?說(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è)元素(開包表示)。內(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?(JNIEnv*env, 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?(JNIEnv*en 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)看。
?
???? 下一篇,我會(huì)繼續(xù)整理JNI的基礎(chǔ)知識(shí),包括類型映射、域簽名等;
轉(zhuǎn)載于:https://www.cnblogs.com/wi100sh/p/4309700.html
總結(jié)
以上是生活随笔為你收集整理的【转】JNI学习积累之一 ---- 常用函数大全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下仅仅有rman备份集的异机不
- 下一篇: monkey的具体使用及详细说明