android ndk5處理java中數(shù)組對象_第1頁
android ndk5處理java中數(shù)組對象_第2頁
android ndk5處理java中數(shù)組對象_第3頁
android ndk5處理java中數(shù)組對象_第4頁
android ndk5處理java中數(shù)組對象_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論