版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
傳智播客AndroidNDK講師:童澤宇QQ:95617478博客/tongzeyu網(wǎng)址Androidndkcocos2d-x傳智播客
高薪就業(yè)傳智播客C/C++學(xué)院2004傳智播客C/C++學(xué)院處理Java中的數(shù)組對象 還有一個特殊的類型我們沒有討論:arrays。數(shù)組在JNI和Java中有特殊的地位。Java數(shù)組也是對象,他們擁有特有的類型和特有的API。我們接下來改進(jìn)這個Store工程,使得用戶能同時輸入一組數(shù)值到記錄中。保存一個對象的引用到Store中:我們先從Java代碼開始:為了方便操作數(shù)組,我們先下載一個幫助庫:GoogleGuava下載地址:。Guava提供了很多有用的方法來處理基本類型和數(shù)組。打開工程的properties選擇JavaBuildPath。在Libraries選項卡中,通過AddJARs引用Guavajar.Guavajar放到工程目錄下的libs目錄,這個很重要編輯StoreType枚舉,添加兩個新的值:IntegerArrayColorArray:打開Store.java添加四個新方法:返回和保存整型、Color類型數(shù)組:整形數(shù)組類型:int[]顏色數(shù)組類型:color[]最后在MainActivvity.java文件中添加native方法到GUI中。首先在onGetValue()從store中返回數(shù)組,然后用Guava連接字符串功能,我們可以把數(shù)組中的值用分號隔開來,連接成整個字符串,然后顯示他們。連接整形數(shù)組:Ints.join(";",mStore.getIntegerArray(lKey))連接顏色數(shù)組:Joiner.on(";").join(mStore.getColorArray(lKey))在MainActivity.java中,繼續(xù)改進(jìn)onSetValue(),我們拆分用戶輸入的值,將他存進(jìn)數(shù)組,然后發(fā)送到Store中。使用Guava轉(zhuǎn)換功能來完成這個任務(wù):字符串轉(zhuǎn)換成對應(yīng)類型的List(integer和Color)將List<Integer>轉(zhuǎn)換成int[]將List<Color>轉(zhuǎn)換成Color[]轉(zhuǎn)換到native代碼這邊在jni/Store.h中,添加一個新數(shù)組類型枚舉到StoreType中。在聯(lián)合體StoreValue中聲明兩個新字段int32_t*mIntegerArrayjobject*mColorArray。需要知道整形和顏色數(shù)組的長度,所以在StoreEntry中添加新字段mLength。打開jni/Store.c然后在releaseEntryValue位數(shù)組插入對整形數(shù)組和顏色數(shù)組釋放的判斷。相應(yīng)的條目釋放時,分配的數(shù)組空間也應(yīng)該被釋放。重新生成JNI頭文件:_itcast_store_Store.h實現(xiàn)com_itcast_store_Store.h中新生成的方法。從getIntegerArray()開始。JNI數(shù)組對應(yīng)jintArray類型,我們知道int是等價jint的,但是int*不等價jintArray。前者指向內(nèi)存緩沖區(qū),后者是一個對象的引用。為了返回一個jintArray,我們用JNIAPI中的方法來實例化一個新的Java數(shù)組:NewIntArray(pEnv,lEntry->mLength)用SetIntArrayRegion()來拷貝native中的整形數(shù)組到到j(luò)intArray:SetIntArrayRegion(pEnv,lIntArray,0,lEntry->mLengt...此外,SetIntArrayRegion()會執(zhí)行邊界檢查來防止緩沖區(qū)溢出,越界時會返回ArrayIndexOutOfBoundsException()異常實現(xiàn)setIntegerArray()。用GetIntArrayRegion()保存Java數(shù)組到native代碼用GetArrayLength()來獲取需要分配的緩沖區(qū)大小GetIntArrayRegion()也執(zhí)行邊界檢查并且可以引發(fā)異常執(zhí)行上面的API后我們應(yīng)使用ExceptionCheck()檢查異常,如果返回值為真,則出現(xiàn)了異常,此時必須停止函數(shù)的執(zhí)行實現(xiàn)getColorArray()對象數(shù)組不同于基本數(shù)組,里面的元素是類類型的一個實例,使用FindClass找到Color類,然后使用NewObjectArray創(chuàng)建對象數(shù)組:jobjectArray FindClass(pEnv,"com/Store/Color") NewObjectArray(pEnv,lEntry->mLength,lColorClass,NULL)對象數(shù)組用jobjectArray表示,可以通過SetObjectArrayElement()一個個設(shè)置其中的對象。在native中使用此API可以將Color對象存放在數(shù)組中。 SetObjectArrayElement(pEnv,lColorArray,i, lEntry- >mValue.mColorArray[i]);調(diào)用完SetObjectArrayElement依然用ExceptionCheck檢查異常別忘記使用DeleteLocalRef刪除掉FindClass對Color類的引用實現(xiàn)setColorArray中使用GetArrayLength獲取對象數(shù)組長度用GetObjectArrayElement()來一個個返回數(shù)組元素。返回的是局部引用的,我們應(yīng)該將它轉(zhuǎn)換成全局引用才能安全的存放到內(nèi)存緩沖區(qū)中。如果一個錯誤出現(xiàn)了,全局引用必須被銷毀以便允許垃圾回收使用DeleteGlobalRef刪除全局引用使用NewGlobalRef轉(zhuǎn)換Color對象為全局引用使用完GetObjectArrayElement返回的對象后使用DeleteLocalRef刪除對象的局部引用運(yùn)行程序看看效果,我們已經(jīng)能夠把Java數(shù)組傳遞到native中,也能從native傳到外面。但是只能通過專用的API在C代碼中操作對象數(shù)組。 可用的基本數(shù)組類型有jbooleanArray,jbyteArray,jcharArray,jdoubleArray,jfloatArray,jlongArray和jshortArray這些數(shù)組都是通過set操作,有以下幾種方式訪問數(shù)組內(nèi)容Get<Primitive>ArrayRegion()和Set<Primitive>ArrayRegion()拷貝Java數(shù)組內(nèi)容到native數(shù)組中,或者反過來。Get<Primitive>ArrayElements(),Set<Primitive>ArrayElements(),和Release<Primitive>ArrayElements()直接訪問數(shù)組中對應(yīng)元素Get<Primitive>ArrayCritical()和Release<Primitive>ArrayCritical()檢查JNI異常
在JNI中,方法中引起的異常我們應(yīng)該仔細(xì)檢查。如果返回一個值或一個指針,檢查返回值就足以判斷是否發(fā)生了錯誤。但是有時候用類似于GetIntArrayRegion()這樣的Java方法或回調(diào)的時候沒有返回值。既然這樣我們應(yīng)該的使用ExceptionOccured()或者ExceptionCheck()來檢查異常。前者返回一個包含引起異常引用的jthrowable類型,后者直接返回一個布爾變量來指示是否出現(xiàn)異常。 當(dāng)一個異常發(fā)生時,隨后的所有調(diào)用都會失敗直到以下情況發(fā)生:方法返回了或者異常傳遞出去了異常被清除了,清除一個異常意味著異常被處理了,因此不會傳遞到Java中,例如:ExceptionDescribe()是一個實用的函數(shù),它像Java中的printStackTrace()一樣可以轉(zhuǎn)儲異常內(nèi)容。當(dāng)處理異常時只有很少的JNI方法能安全的被調(diào)用,如下:DeleteLocalRef()PushLocalFrame()DeleteGlobalRef()PopLocalFrame()ExceptionOccured()ReleaseStringChars()ExceptionDescribe()ReleaseStringUTF
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全國教育大會解讀
- 中班安全教育教案40篇冬季
- 煤礦應(yīng)急救援應(yīng)知應(yīng)會100題課件
- 高考調(diào)研高考數(shù)學(xué)一輪復(fù)習(xí)第十章第課時
- 2024至2030年中國感光涂膠布生產(chǎn)線數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國布飾發(fā)圈行業(yè)投資前景及策略咨詢研究報告
- 2024年四川省瀘州市中考語文試題含解析
- 2024年中國緊急轉(zhuǎn)動式蘑菇鈕市場調(diào)查研究報告
- 2024年中國短滴狀塑料片自動鎖市場調(diào)查研究報告
- 2024年中國凍兔肉排市場調(diào)查研究報告
- 2024年江蘇蘇州張家港市人社局招聘公益性崗位(編外)人員2人歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 浪潮人力崗在線測評題
- 統(tǒng)編版2024新版道德與法治七年級上冊11.2《樹立正確的人生目標(biāo)》教學(xué)設(shè)計
- 期中 (試題) -2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 應(yīng)急預(yù)案演練、總結(jié)和評估制度
- 2024湘教版初中八年級數(shù)學(xué)上冊第章分式大單元整體教學(xué)設(shè)計
- 嶺南版2年級上冊美術(shù) 9我家的菜籃子 說課 教案
- 防風(fēng)應(yīng)急預(yù)案
- 《ISO 55001-2024資產(chǎn)管理-資產(chǎn)管理體系-要求》之1:“4 組織環(huán)境-4.1理解組織及其環(huán)境”解讀和應(yīng)用指導(dǎo)材料(雷澤佳-2024)
- 4《平平安安回家來》第二課時(教學(xué)設(shè)計)-一年級道德與法治上冊統(tǒng)編版·2024
- 2024年南昌市南昌縣城管委招考編外城管協(xié)管員高頻500題難、易錯點模擬試題附帶答案詳解
評論
0/150
提交評論