在Java中數組分為兩種:
(1)、基本類型數組
(2)、對象類型(Object[])的數組 (數組中存放的是指向Java對象中的引用)
一個能通用于兩種不同類型數組的函數:
GetArrayLength(jarray array);
首先來看一下怎麼處理基本類型的數組 :
(1) Get<Type>ArrayElements(<Type>Array arr, jboolean* isCopide);
這類函數可以把Java基本類型的數組轉換到C/C++中的數組,有兩種處理方式,一種是拷貝一份傳回本地代碼,另一個是把指向Java數組的指針直接傳回到本地代碼中,處理完本地化的數組後,通過Release<Type>ArrayElements來釋放數組
(2) Release<Type>ArrayElements(<Type>Array arr , <Type>* array , jint mode)
用這個函數可以選擇将如何處理Java跟C++的數組,是送出,還是撤銷等,記憶體釋放還是不釋放等
mode可以取下面的值:
0 : 對Java的數組 更新,釋放C/C++的數組
JNI_COMMIT(1) :對Java的數組 更新,不釋放C/C++的數組
JNI_ABORT(2): 對Java的數組 不更新,釋放C/C++的數組
(3) GetPrimittiveArrayCritical(jarray arr , jboolean* isCopied);
(4) ReleasePrimitiveArrayCritical(jarray arr , void* array , jint mode);
也是JDK1.2出來的,為了增加直接傳回指向Java數組的指針而加入的函數,同樣的也會有同GetStringCritical的死鎖的問題
(5) Get<Type>ArrayRegion(<Type>Array arr , jsize start , jsize len , <Type>* buffer);
在C/C++預先開辟一段記憶體,然後把Java基本類型的數組拷貝到這段記憶體中,這個方法和之前拷貝字元串的GetStringRegion方法的原理是類似的
(6) Set<Type>ArrayRegion(<Type>Array arr , jsize start , jsize len , const <Type>* buffer);
把Java基本類型的數組中的指定範圍的元素用C/C++的數組中的元素來指派
(7) <Type>Array New<Type>Array(jsize sz)
指定一個長度然後傳回相應的Java基本類型的數組
在來看一下怎麼處理對象型數組 :
JNI沒有提供直接把Java的對象類型數組(Object[])直接轉到C++中的Object[]數組的函數,而是直接通過GetObjectArrayElement/SetObjectArrayElement這樣的函數來對Java的Object[]數組進行操作由于取的對象數組沒有進行拷貝,是以不需要釋放任何資源
NewObjectArray可以通過指定長度跟初始值來建立某個類的數組
1、
2、
3、
4、
5、