JNI:如何操作數(shù)組
1. 數(shù)組的分類
數(shù)組分為兩種
基本數(shù)據(jù)類型的數(shù)組
對象類型(Object[])的數(shù)組
一個能通用于兩種不同數(shù)據(jù)類型數(shù)組的函數(shù)
GetArrayLength( jarray array);//獲取長度2. 基本數(shù)據(jù)類型數(shù)組
處理基本數(shù)據(jù)類型數(shù)組的時候,也是跟處理字符串類型,有很相似的函數(shù)
GetArrayElements( Array arr, jboolean* isCopied); 這類函數(shù)可以把Java基本類型的數(shù)組轉(zhuǎn)換到C/C++的數(shù)組,有兩種處理方式,一是拷貝一份傳回本地代碼,另一個是把指向Java數(shù)組的指針直接傳回到本地代碼。處理完本地的數(shù)組后,通過Release
ReleaseArrayElements( Array arr, * array, jint mode ); 用這個函數(shù)可以選擇將如何處理Java跟C++的數(shù)組。是提交、還是撤銷等;內(nèi)存釋放還是不釋放等。
mode 可以取下面的值:
0 對Java的數(shù)組進行更新,并釋放 C/C++ 的數(shù)組
JNI_COMMIT 對Java的數(shù)組進行更新,但是不釋放C/C++的數(shù)組
JNI_ABORT ?對Java的數(shù)組不進行更新,釋放C/C++的數(shù)組
JDK 1.2 為了增加直接傳回指向 Java 數(shù)組的指針,而增加了以下函數(shù)。但是同樣的,也會有同GetStringCritical的死鎖問題
GetPrimitiveArrayCritical( jarray arr, jboolan* isCopied);ReleasePrimitiveArrayCritical(jarray arr, void array, jint mode);
在C/C++預(yù)先開辟一塊內(nèi)存,然后把Java基本數(shù)組類型的數(shù)組拷貝到這塊內(nèi)存當中。跟GetStringRegion原理相似
GetArrayRegion( Array arr, jsize, start, jsize len, * buffer); 把Java基本數(shù)據(jù)類型的數(shù)組中的指定范圍的元素用 C/C++的數(shù)組中的元素來賦值
SetArrayRegion( Array arr, jsize start, jsize len, const * buffer ); 指定一個長度,然后返回相應(yīng)Java基本類型的數(shù)組
Array NewArray( jsize len ); 3. 對象類型數(shù)組
Object[]
JNI 沒有提供直接把Java的對象類型數(shù)組( Object[] )直接轉(zhuǎn)到 C/C++ 的 jobject[] 數(shù)組的函數(shù)。而是直接通過GetObjectArrayElement /SetObjectArrayElement 這樣的函數(shù)來對Java的Object[]數(shù)組進行操作。

分享&在看
