日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JNI学习积累之一 ---- 常用函数大全

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI学习积累之一 ---- 常用函数大全 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 本文原創(chuàng),轉(zhuǎn)載請注明出處:http://blog.csdn.NET/qinjuning

?

?

?

?????? ? 最近一段時間,在工作方面比較閑,分配的Bug不是很多,于是好好利用這段時間就著源代碼看了些許模塊,?主要方式

?? 還是賊看代碼,?同利用燒機(jī)的便利,加Log觀看,基本上都能弄個臉熟 。心里想著該寫點(diǎn)什么了?可是水平夠,再加上

?? 包括很多真正實(shí)現(xiàn)地方--中間層,基本上沒看。于是乎,也就不好賣弄了。

?

????? 花了幾天時間研究了下JNI,基本上知道如何使用了。照我的觀點(diǎn)JNI還是不難的,難得只是我們一份嘗試的心。 學(xué)習(xí)過程中,

??發(fā)現(xiàn)關(guān)于JNI函數(shù)資料真的很少,所謂“工欲善其事,便先利其器”,整理出了這份資料,希望能幫助你克服JNI學(xué)習(xí)的坎。

?????

????? 主要資料來源: 百度文庫的JNI常用函數(shù)》?。

???? ?同時對其加以了補(bǔ)充 。

???

?

要素? :1、 該函數(shù)大全是基于C語言方式的,對于C++方式可以直接轉(zhuǎn)換 ,例如,對于生成一個jstring類型的方法轉(zhuǎn)換分別如下:

???????????????????? C編程環(huán)境中使用方法為:(*env)?->NewStringUTF(env , "123") ;

??????????????????? C++編程環(huán)境中(例如,VC下)則是: env?->NewStringUTF( "123") ;??????????? ?(使用起來更簡單)

?

???????????2、關(guān)于下列有些函數(shù)中:*isCopy???? 的說明,例如,如下函數(shù):?????????????????????

????????????????????? ???? ?const?char*?GetStringUTFChars(JNIEnv*env, jstring string,?jboolean *isCopy);??

?

????????對第三個參數(shù)?jboolean *isCopy說明如下:

?????????????當(dāng)從JNI函數(shù)GetStringUTFChars函數(shù)中返回得到字符串B時,如果B是原始字符串Java.lang.String的一份拷貝,

??????則isCopy? 被賦值為JNI_TRUE。如果B是和原始字符串指向的是JVM中的同一份數(shù)據(jù)則isCopy? 被賦值為JNI_FALSE。

?????當(dāng)isCopy? 為JNI_FALSE時,本地代碼絕不能修改字符串的內(nèi)容,否則JVM中的原始字符串也會被修改,這會打破Java語言

????? 中字符串不可變的規(guī)則。

??????????? 通常,我們不必關(guān)心JVM是否會返回原始字符串的拷貝,只需要為isCopy傳遞NULL作為參數(shù) 。

?????????????????????????????????????????????????????????????????????????????????????????????????????????? ----?????以上內(nèi)容來自?《JNI編程指南》

?

一、類操作?????????????

? ? ? ? ? ? ? ? ??? ? ? ? ??

? jclass?const jbyte *buf , jsize bufLen); ? ? ? ? ? ? ? ??

? ? ?功能:從原始類數(shù)據(jù)的緩沖區(qū)中加載類。?????????????

? ? ?參數(shù):?env ? ? ? ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?loader ? ?分派給所定義的類的類加載器。??????????

? ? ? ? ? ? ? ? ?buf ? ? ? ?包含 .class 文件數(shù)據(jù)的緩沖區(qū)。???????????????

? ? ? ? ? ? ? ? ?bufLen ?緩沖區(qū)長度。??????????

? ? ?返回值:返回 Java 類對象。如果出錯則返回NULL。 ? ? ? ? ? ?

? ? ?拋出:?ClassFormatError ? ? ?如果類數(shù)據(jù)指定的類無效。 ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ?ClassCircularityError ?如果類或接口是自身的超類或超接口。 ??????????????

? ? ? ? ? ? ? ? ? ? ? ?OutOfMemoryError ?如果系統(tǒng)內(nèi)存不足。??????????????????

? ? ? ? ? ? ? ? ??? ? ??

? ?jclass?FindClass?(JNIEnv *env, const char *name);????????????????

?????功能: 該函數(shù)用于加載本地定義的類。它將搜索由CLASSPATH 環(huán)境變量為具有指定名稱的類所指定的目錄和 zip文件。????????????

?????參數(shù):env ? ?JNI 接口指針。 ? ? ? ? ? ?

??????????????name ?類全名(即包名后跟類名,之間由"/"分隔).如果該名稱以“[(數(shù)組簽名字符)打頭,則返回一個數(shù)組類。 ? ? ? ??

???? 返回值:返回類對象全名。如果找不到該類,則返回 NULL。 ? ? ? ? ? ? ??

???? 拋出: ??ClassFormatError ? ? ? ? ?如果類數(shù)據(jù)指定的類無效。 ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ClassCircularityError ? ? ?如果類或接口是自身的超類或超接口。????????????????

? ? ? ? ? ? ? ? ? NoClassDefFoundError ?如果找不到所請求的類或接口的定義。????????????

? ? ? ? ? ? ? ? ? OutOfMemoryError ? ? ? 如果系統(tǒng)內(nèi)存不足。??????????????????

?

??jclass?GetObjectClass?(JNIEnv *env, jobject obj);?

?????功能:通過對象獲取這個類。該函數(shù)比較簡單,唯一注意的是對象不能為NULL,否則獲取的class肯定返回也為NULL。?????

???? 參數(shù): ?env ? JNI 接口指針。 ? ? ? ? ? ?

????????????????obj? ?Java 類對象實(shí)例。 ? ??? ??

? ?

??jclass?GetSuperclass?(JNIEnv *env, jclass clazz);??????????

? ? ?功能:獲取父類或者說超類 。?如果 clazz 代表類class而非類 object,則該函數(shù)返回由 clazz 所指定的類的超類。 如果 clazz?

? ? ? ? ? ?指定類 object 或代表某個接口,則該函數(shù)返回NULL。 ? ? ??? ??

? ? ?參數(shù): ?env ? JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? clazz ?Java 類對象。????????????

? ? ?返回值: ? ?由 clazz 所代表的類的超類或 NULL。 ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??? ? ? ??

? jboolean?IsAssignableFrom?(JNIEnv *env, jclass clazz1, ?jclass clazz2); ? ? ? ? ??

? ? 功能:確定 clazz1 的對象是否可安全地強(qiáng)制轉(zhuǎn)換為clazz2。????????????

? ??參數(shù): ?env ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? clazz1 第一個類參數(shù)。???????????????

? ? ? ? ? ? ? clazz2 第二個類參數(shù)。???????????????

? ? 返回值: ?下列某個情況為真時返回 JNI_TRUE: ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? 1、?第一及第二個類參數(shù)引用同一個 Java 類。 ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? 2、 第一個類是第二個類的子類。?????????????

? ? ? ? ? ? ? ? ? ? 3、 第二個類是第一個類的某個接口。????

?

? ?

?????????

、異常操作 ? ? ?? ? ? ? ? ??

? ? ? ? ??? ? ? ? ? ? ??

? jint ?Throw(JNIEnv *env, jthrowable obj);?????????

? ? ??功能:拋出 java.lang.Throwable 對象。?????????????????

? ? ? ?參數(shù):?env ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?obj ? java.lang.Throwable 對象。?????????

? ? ? ?返回值: ?成功時返回 0,失敗時返回負(fù)數(shù)。 ? ? ? ? ? ??

? ? ? ?拋出: ? ?java.lang.Throwable 對象 obj。 ? ? ? ? ??

? ??? ? ? ? ? ??

??jint?ThrowNew?(JNIEnv *env , ?jclass clazz, ?const char *message); ? ? ? ? ? ?

? ? ?功能:利用指定類的消息(由 message 指定)構(gòu)造異常對象并拋出該異常。???????????????

? ? ?參數(shù):?env ? ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? clazz ?java.lang.Throwable 的子類。??????????

? ? ? ? ? ? ? ? message ?用于構(gòu)造java.lang.Throwable對象的消息。???????????

? ? ?返回值:?成功時返回 0,失敗時返回負(fù)數(shù)。 ? ? ? ? ? ??

? ? ?拋出: ?新構(gòu)造的 java.lang.Throwable 對象。 ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ???

? jthrowable?ExceptionOccurred?(JNIEnv *env);??????????????

????功能:確定是否某個異常正被拋出。在平臺相關(guān)代碼調(diào)用 ExceptionClear() 或 Java 代碼處理該異常前,異常將始終保持

??????? 拋出狀態(tài)。??????????????????

????參數(shù): ?env ?JNI 接口指針。 ? ? ? ? ? ?

????返回值:?返回正被拋出的異常對象,如果當(dāng)前無異常被拋出,則返回NULL。 ? ? ? ? ??

? ? ? ? ? ? ? ? ??? ??

?void?ExceptionDescribe?(JNIEnv *env);?????????

????功能:將異常及堆棧的回溯輸出到系統(tǒng)錯誤報告信道(例如 stderr)。該例程可便利調(diào)試操作。???????????????

????參數(shù):env ? JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? ????

? void?ExceptionClear?(JNIEnv *env); ? ? ? ? ? ? ? ?

???功能:清除當(dāng)前拋出的任何異常。如果當(dāng)前無異常,則此例程不產(chǎn)生任何效果。??????????????????

???參數(shù):?env ? JNI 接口指針。 ? ? ? ? ? ?

? ??? ? ? ? ? ? ??

??void?FatalError?(JNIEnv *env, const char *msg);???????????

???功能:拋出致命錯誤并且不希望虛擬機(jī)進(jìn)行修復(fù)。該函數(shù)無返回值。?????????????

???參數(shù):??env ? JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ?msg ? 錯誤消息。??????????

?????????????

? ?

?????

?

三、全局及局部引用?????????????

? ? ? ? ? ? ? ? ??? ??

? ?jobject?NewGlobalRef?(JNIEnv *env, jobject obj);?????????

? ? ?功能:創(chuàng)建 obj 參數(shù)所引用對象的新全局引用。obj 參數(shù)既可以是全局引用,也可以是局部引用。全局引用通過調(diào)用?

? ? ? ? ? DeleteGlobalRef() 來顯式撤消。??????????

? ? ?參數(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 ?局部引用。????????????

?????????????

? ?

????

?

四、對象操作 ? ?? ? ??

? ? ? ? ??

? jobject?AllocObject?(JNIEnv *env, jclass clazz);??????????????

? ? ?功能:分配新 Java 對象而不調(diào)用該對象的任何構(gòu)造函數(shù)。返回該對象的引用。clazz 參數(shù)務(wù)必不要引用數(shù)組類。 ? ? ? ? ? ? ??

? ? ?參數(shù):?env ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ?clazz ?Java 類對象。????????????

? ? ?返回值:?返回 Java 對象。如果無法構(gòu)造該對象,則返回NULL。 ? ? ? ? ? ? ? ??

? ? ?拋出:?InstantiationException:如果該類為一個接口或抽象類。 ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ??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 對象。方法 ID指示應(yīng)調(diào)用的構(gòu)造函數(shù)方法。注意:該 ID特指該類class的構(gòu)造函數(shù)ID , 必須通過調(diào)用?

??????GetMethodID() 獲得,且調(diào)用時的方法名必須為 <init>,而返回類型必須為 void (V)。clazz參數(shù)務(wù)必不要引用數(shù)組類。?

??參數(shù): ?env ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? clazz ?Java 類對象。????????????

? ? ? ? ? ? ? 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 對象,如果無法構(gòu)造該對象,則返回NULL。 ? ? ? ? ? ? ? ??

? 拋出: ??InstantiationException ?如果該類為接口或抽象類。 ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? OutOfMemoryError ? 如果系統(tǒng)內(nèi)存不足。??????????????????

? ? ? ? ? ? ? 構(gòu)造函數(shù)拋出的任何異常。??????????????????

? ? ? ? ? ? ? ? ??? ? ? ? ? ? ?

? jclass?GetObjectClass?(JNIEnv *env, jobject obj);?????????

? ?功能:返回對象的類。?????????????

? ?參數(shù):?env ?JNI 接口指針。 ? ? ? ? ? ?

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

? ?返回值:?返回 Java 類對象。 ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ??? ? ? ??

?jboolean?IsInstanceOf?(JNIEnv *env, jobject obj,?jclass clazz); ? ? ? ? ? ??

???功能:測試對象是否為某個類的實(shí)例。??????????????????

???參數(shù):??env ?JNI 接口指針。 ? ? ? ? ? ?

???????????????obj ?Java 對象。???????????

???????????????clazz Java 類對象。????????????

???返回值:如果可將 obj 強(qiáng)制轉(zhuǎn)換為 clazz,則返回 JNI_TRUE。否則返回 JNI_FALSE。NULL 對象可強(qiáng)制轉(zhuǎn)換為任何類。 ? ? ? ? ??

? ? ? ? ? ? ? ? ??? ? ? ? ?

?jbooleanIsSameObject?(JNIEnv *env, jobjectref1,?jobject ref2); ? ? ? ? ? ?

? ? 功能:測試兩個引用是否引用同一 Java 對象。?????????

? ? 參數(shù): ?env ?JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ????? ?ref1 ?Java 對象。??????????????????

? ? ? ? ????? ?ref2 ? Java 對象。??????????????????

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

????????

? ?

????

??????????????????

五、?字符串操作?????????????

? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??

? jstring??NewString?(JNIEnv *env, const jchar *unicodeChars, ??jsize len); ? ? ? ??

??? 功能:利用 Unicode 字符數(shù)組構(gòu)造新的 java.lang.String 對象。???????????????

??? 參數(shù): ??env:JNI 接口指針。 ? ? ? ? ? ?

?????????????????unicodeChars:指向 Unicode 字符串的指針。?????????

?????????????????len:Unicode 字符串的長度。?????????????

??? 返回值:?Java 字符串對象。如果無法構(gòu)造該字符串,則為NULL。 ? ? ? ? ? ??

????拋出:?OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。 ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ??? ? ? ? ? ??

?jsize??GetStringLength?(JNIEnv *env, jstring string);????????????

? ? 功能:返回 Java 字符串的長度(Unicode 字符數(shù))。?????????????????

? ? 參數(shù): ?env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? string:Java 字符串對象。??????????

? ? 返回值:?Java 字符串的長度。 ? ? ? ? ? ?

? ? ? ? ? ? ? ??? ? ? ? ? ? ??

? const??jchar *??GetStringChars?(JNIEnv*env, jstring string, ?jboolean *isCopy); ? ? ? ? ??

? ?功能:返回指向字符串的 Unicode 字符數(shù)組的指針。該指針在調(diào)用 ReleaseStringchars() 前一直有效。??????????

? ? ? ? ?如果 isCopy 非空,則在復(fù)制完成后將 *isCopy 設(shè)為 JNI_TRUE。如果沒有復(fù)制,則設(shè)為JNI_FALSE。 ?

? ?參數(shù): ??env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? string:Java 字符串對象。??????????

? ? ? ? ? ? ? ??isCopy:指向布爾值的指針。???????????????

?? 返回值: ??指向 Unicode 字符串的指針,如果操作失敗,則返回NULL。 ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ??

?void??ReleaseStringChars?(JNIEnv *env, jstring string, ?const jchar *chars); ? ? ? ? ? ? ? ? ?

???功能:通知虛擬機(jī)平臺相關(guān)代碼無需再訪問 chars。參數(shù)chars 是一個指針,可通過 GetStringChars() 從 string 獲得。 ? ?

???參數(shù):?env:JNI 接口指針。 ? ? ? ? ? ?

????????????? string:Java 字符串對象。??????????

????????????? chars:指向 Unicode 字符串的指針。???????????????

? ? ? ? ? ? ? ? ?? ? ? ?

?jstring??NewStringUTF?(JNIEnv *env, const char *bytes);????????????

? ?功能:利用 UTF-8 字符數(shù)組構(gòu)造新 java.lang.String 對象。???????????????

? ?參數(shù):?env:JNI 接口指針。如果無法構(gòu)造該字符串,則為 NULL。 ? ? ? ??

????????????? bytes:指向 UTF-8 字符串的指針。??????????

? ?返回值:Java 字符串對象。如果無法構(gòu)造該字符串,則為NULL。 ? ? ? ? ? ??

? ?拋出: ?OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。 ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ??? ? ? ? ??

?jsize??GetStringUTFLength?(JNIEnv *env, jstring string);??????????????

? ?功能:以字節(jié)為單位返回字符串的 UTF-8 長度。 ? ? ? ? ? ? ? ?

?? 參數(shù):?? env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ?string:Java 字符串對象。??????????

? ?返回值: ?返回字符串的 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 字符串對象。??????????

? ? ? ? ? ? ? isCopy:指向布爾值的指針。???????????????

? ?返回值: ?指向 UTF-8 字符串的指針。如果操作失敗,則為 NULL。 ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??? ? ? ? ??

? void??ReleaseStringUTFChars?(JNIEnv *env, jstring string, ?const char *utf); ? ? ? ? ? ? ??

? ?功能:通知虛擬機(jī)平臺相關(guān)代碼無需再訪問 utf。utf 參數(shù)是一個指針,可利用 GetStringUTFChars() 獲得。 ? ? ? ? ? ? ? ? ?

?? 參數(shù): ? env:JNI 接口指針。 ? ? ? ? ? ?

?????????????? string:Java 字符串對象。??????????

? ? ? ? ? ? ?? utf:指向 UTF-8 字符串的指針。???????????????

?

?

? ?

?????????

六、數(shù)組操作 ? ? ? ? ? ? ? ??? ? ? ? ?


?jsize?GetArrayLength?(JNIEnv *env, jarray array);?????????????????

? ?功能:返回數(shù)組中的元素數(shù)。??????????????????

? ?參數(shù): ?env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? array:Java 數(shù)組對象。????????????????

? ?返回值:?數(shù)組的長度。 ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ??? ? ? ? ? ?

?jarray?NewObjectArray?(JNIEnv *env, jsize length, ?jclass elementClass, jobject initialElement); ? ? ? ? ??

???功能:構(gòu)造新的數(shù)組,它將保存類 elementClass 中的對象。所有元素初始值均設(shè)為 initialElement。???????????????

???參數(shù):?env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ?length:數(shù)組大小。???????????????

? ? ? ? ? ? ?elementClass:數(shù)組元素類。???????????????

? ? ? ? ? ? ?initialElement:初始值。 ? ?可以為NULL 。 ? ? ? ? ??

? ?返回值:Java 數(shù)組對象。如果無法構(gòu)造數(shù)組,則為 NULL。 ? ? ? ? ? ? ? ? ?

? ?拋出: ?OutOfMemoryError:如果系統(tǒng)內(nèi)存不足。 ? ? ? ? ? ? ? ? ?

? ?

? ?說明: 使用該函數(shù)時,為了便于易操作性,我們一般可以用jobjectArray數(shù)組類型或得返回值,例如:

? ? ? ? ? ? ? ? ?jobjectArray objArray = env->NewObjectArray ( );

? ? ? ? ? ? ? ? ?//操作該對象

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

? ?拋出:?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方法類型??????

?????????New<PrimitiveType>Array?(JNIEnv *env,?ArrayType array, jboolean*isCopy); ? ? ? ? ? ? ? ? ?

?

? ? ?說明: 用于構(gòu)造新基本類型數(shù)組對象的一系列操作。下表說明了特定的基本類型數(shù)組構(gòu)造函數(shù)。用戶應(yīng)把

? ? New<PrimitiveType>Array 替換為某個實(shí)際的基本類型數(shù)組構(gòu)造函數(shù)例程名(見下表),然后將 ArrayType替換為

 該例程相應(yīng)的數(shù)組類型。

?????參數(shù): ?env : JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?length:數(shù)組長度。???????????????

?????返回值: ?Java 數(shù)組。如果無法構(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); ? ? ? ? ? ? ? ? ?

? ?說明:一組返回基本類型數(shù)組體的函數(shù)。結(jié)果在調(diào)用相應(yīng)的 Release<PrimitiveType>ArrayElements()函數(shù)前將一直有效。

? ? ?由于返回的數(shù)組可能是 Java 數(shù)組的副本,因此對返回數(shù)組的更改不必在基本類型數(shù)組中反映出來,直到調(diào)用了

? ? ?Release<PrimitiveType>ArrayElements()。?如果 isCopy 不是 NULL,*isCopy 在復(fù)制完成后即被設(shè)為 JNI_TRUE。如果

? ? ?未復(fù)制,則設(shè)為 JNI_FALSE。 ? ? ? ? ?

?   使用說明: ??

? ?    ? 將 Get<PrimitiveType>ArrayElements 替換為表中某個實(shí)際的基本類型元素訪問器例程名。?????????????

? ? ?    將 ArrayType 替換為對應(yīng)的數(shù)組類型。?????????????

? ? ?    將 NativeType 替換為該例程對應(yīng)的本地類型。???????????????

????參數(shù):???env:JNI 接口指針。 ? ? ? ? ? ?

??????????????? array:Java 字符串對象。???????????

? ? ? ? ? ? ? ? isCopy:指向布爾值的指針。???????????????

? ? 返回值:????返回指向數(shù)組元素的指針,如果操作失敗,則為 NULL。 ? ? ? ? ?

?????????????

? ?? 不管布爾數(shù)組在 Java 虛擬機(jī)中如何表示,GetBooleanArrayElements() 將始終返回一個 jbooleans 類型的指針,其中每一

 字節(jié)代表一個元素(開包表示)。內(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ī)平臺相關(guān)代碼無需再訪問 elems 的一組函數(shù)。elems 參數(shù)是一個通過使用對應(yīng)的

??????? Get<PrimitiveType>ArrayElements() 函數(shù)由 array 導(dǎo)出的指針。必要時,該函數(shù)將把對 elems 的修改復(fù)制回基本

??????? 類型數(shù)組。mode參數(shù)將提供有關(guān)如何釋放數(shù)組緩沖區(qū)的信息。如果elems 不是 array 中數(shù)組元素的副本,mode將無效。

??????? 否則,mode 將具有下表所述的功能:?????????????

??????????????????????? 模式???????????????????????????????????????? 動作????????

???????????????????????? 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)存管理,但使用時務(wù)必慎重。?????????????

??? ?使用說明:

???????? 將 ArrayType 替換為對應(yīng)的數(shù)組類型。?????????????

???????? 將 NativeType 替換為該例程對應(yīng)的本地類型。???????????????

????

?? 參數(shù):?env:JNI 接口指針。????????????

?????????????array:Java 數(shù)組對象。????????????????

?????????????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ù)。????????????????????

??????使用說明:????????

?????????????? 將 Get<PrimitiveType>ArrayRegion 替換為下表的某個實(shí)際基本類型元素訪問器例程名。

????????????? ?將 ArrayType 替換為對應(yīng)的數(shù)組類型。?????????????

?????????????? 將 NativeType 替換為該例程對應(yīng)的本地類型。?????

?? 參數(shù):?????env:JNI 接口指針。????????????

???????????????? array:Java 指針。????????????????

???????????????? start:起始下標(biāo)。??????????????????

???????????????? len:要復(fù)制的元素數(shù)。?????????????????

???????????????? buf:目的緩沖區(qū)。????????????????

?? 拋出:??ArrayIndexOutOfBoundsException:如果區(qū)域中的某個下標(biāo)無效。??

??????????

?? 方法族如下:?????????????????????  ????  

????????????????????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ù)制回來的一組函數(shù)。?????????????

????????使用說明:??將 Set<PrimitiveType>ArrayRegion 替換為表中的實(shí)際基本類型元素訪問器例程名。??????????

??????????????????????????將 ArrayType 替換為對應(yīng)的數(shù)組類型。?????????????

??????????????????????????將 NativeType 替換為該例程對應(yīng)的本地類型。???????????????

????參數(shù):?env:JNI 接口指針。????????????

??????????????array:?Java 數(shù)組。??????????????

??????????????start:起始下標(biāo)。??????????????????

??????????????len:要復(fù)制的元素數(shù)。?????????????????

??????????????buf:源緩沖區(qū)。????????????

????拋出:?ArrayIndexOutOfBoundsException:如果區(qū)域中的某個下標(biāo)無效。?

? ????  

????????????????? 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

???????

? ?

?

?

?

?六、訪問對象的屬性和方法??????????????????

???

1、實(shí)例屬性的訪問

???????????????????????????

??jfieldID??GetFieldID?(JNIEnv *env, jclass clazz,?const char *name, const char *sig);????????????????

?? 功能:返回類的實(shí)例(非靜態(tài))域的屬性 ID。該域由其名稱及簽名指定。訪問器函數(shù)的Get<type>Field 及 Set<type>Field

??????? 系列使用域 ID 檢索對象域。GetFieldID() 不能用于獲取數(shù)組的長度域。應(yīng)使用GetArrayLength()。??????????

?? 參數(shù):??env:JNI 接口指針。????????????

???????????????clazz:Java 類對象。????????????

?????????????? 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);????????????????

??? 功能:該訪問器例程系列返回對象的實(shí)例(非靜態(tài))域的值。要訪問的域由通過調(diào)用GetFieldID() 而得到的域 ID 指定。???????????

????參數(shù):???env:JNI 接口指針。????????????

???????????????? obj:Java 對象(不能為 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);???????????

??功能: 該訪問器例程系列設(shè)置對象的實(shí)例(非靜態(tài))屬性的值。要訪問的屬性由通過調(diào)用SetFieldID() 而得到的屬性 ID指定。

?

???參數(shù):??env:JNI 接口指針。????????????

?????????????? obj:Java 對象(不能為 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)屬性的訪問 :也存在相同的方法,

?

????? ??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ū)別在于第二個參數(shù)jclass classzz代表的是類引用,而不是類實(shí)例。

????????

?3、調(diào)用實(shí)例方法?

??????

? ?jmethodID?GetMethodID(JNIEnv *env, jclass clazz, ? ?const char *name, const char *sig); ? ? ? ? ? ? ? ?

??? 功能:返回類或接口實(shí)例(非靜態(tài))方法的方法 ID。方法可在某個 clazz 的超類中定義,也可從 clazz 繼承。該方法由其名稱

? ? ? ? ?和簽名決定。?GetMethodID() 可使未初始化的類初始化。要獲得構(gòu)造函數(shù)的方法 ID,應(yīng)將 <init> 作為方法名,同時將?

? ? ? ? ?void (V) 作為返回類型。 ? ? ? ? ?

? ? 參數(shù): ?env:JNI 接口指針。 ? ? ? ? ? ?

? ? ? ? ? ? ? ? clazz:Java 類對象。????????????

? ? ? ? ? ? ? ? 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ù)以"鏈表"形式附加

?????

??說明:這三個操作的方法用于從本地方法調(diào)用Java 實(shí)例方法。它們的差別僅在于向其所調(diào)用的方法傳遞參數(shù)時所用的機(jī)制。 ??

??????這三個操作將根據(jù)所指定的方法 ID 調(diào)用 Java 對象的實(shí)例(非靜態(tài))方法。參數(shù) methodID 必須通過調(diào)用 GetMethodID()?

??????來獲得。當(dāng)這些函數(shù)用于調(diào)用私有方法和構(gòu)造函數(shù)時,方法 ID 必須從obj 的真實(shí)類派生而來,而不應(yīng)從其某個超類派生。

????? 當(dāng)然,附加參數(shù)可以為空 。

??參數(shù): ?env:JNI 接口指針。 ? ? ? ? ? ?

???????????? obj:Java 對象。???????????

???????????? methodID:方法 ID。 ? ? ? ? ??? ? ? ?

? 返回值: 返回調(diào)用 Java 方法的結(jié)果。 ? ? ? ? ? ? ?

??拋出: ?執(zhí)行 Java 方法時拋出的異常。 ? ?

?????????????

?

? ? ?

? ?下表根據(jù)結(jié)果類型說明了各個方法類型。用戶應(yīng)將Call<type>Method 中的 type 替換為所調(diào)用方法的Java 類型(或使用表

?中的實(shí)際方法名),同時將 NativeType 替換為該方法相應(yīng)的本地類型。省略掉了其他兩種類型。?


?

???????????Java層返回值 ? ? ? ? ? ? ? ?? 方法族 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?本地返回類型NativeType


????????? ?返回值為void : ? ? ???? CallVoidMethod( ) ? A?/ V?????????????????????????????? (無)

? ???????? 返回值為引用類型: ?? ?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ū)別在于第二個參數(shù)jclass classzz代表的是類引用,而不是類實(shí)例。

?????

??

?

七、注冊本地方法??????????????????

????????????????

??jint??RegisterNatives?(JNIEnv *env, jclass clazz,?const JNINativeMethod *methods,??? jint? nMethods);???????????????

?? 功能:向 clazz 參數(shù)指定的類注冊本地方法。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 類對象。????????????

????????? ???methods:類中本地方法和具體實(shí)現(xiàn)方法的映射指針。???????????????

?????????? ??nMethods:類中的本地方法數(shù)。?????????????????

? ?返回值:??成功時返回 "0";失敗時返回負(fù)數(shù)。?????????

?? 拋出:??NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。????????????

??????????????????

?jint??UnregisterNatives?(JNIEnv *env, jclass clazz);??????????????

??功能: 取消注冊類的本地方法。類將返回到鏈接或注冊了本地方法函數(shù)前的狀態(tài)。??????該函數(shù)不應(yīng)在常規(guī)平臺相關(guān)代碼中使用。

??????? 相反,它可以為某些程序提供一種重新加載和重新鏈接本地庫的途徑。?????????????

? 參數(shù):??env:JNI 接口指針。????????????

?????????? ? clazz:Java 類對象。????????????

? 返回值:?成功時返回“0”;失敗時返回負(fù)數(shù)。??????????????????

?

?

?

?

????其實(shí),JNI方面的書籍還是比較少的,建議大家看看《JNI編程指南》,算的上個入門書籍吧,指望你能耐心點(diǎn)看。

?

???? 下一篇,我會繼續(xù)整理JNI的基礎(chǔ)知識,包括類型映射、域簽名等;

總結(jié)

以上是生活随笔為你收集整理的JNI学习积累之一 ---- 常用函数大全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。