一. JNI中的數組
1. 基本類型對應的本地數組
| 基本數據類型 |
本地數組 |
| boolean |
jbooleanArray |
| byte |
jbyteArray |
| char |
jcharArray |
| short |
jshortArray |
| int |
jintArray |
| long |
jlongArray |
| float |
jfloatArray |
| object |
jobjectArray |
| double |
jdoubleArray |
2. 數組操作函數
數組函數分為用於對象數組的數組函數和用於基本數據類型數組的數組函數。GetArrayLength函數獲取數組長度,可用於任意數組:
jsize GetArrayLength(j[Type]array array);//Type用基本類型替換
(1)用於對象數組的函數(如String數組,以對象數組傳入JNI,再取出每個元素轉化為jstring使用):
/*<1>創建對象數組,下面的函數創建一個長度為length,並且持有類型為elementClass的對象的對象數組,數組中的所有元素都被置為initialElement*/
jobjectArray NewObjectArray(jsize length, jclass elementClass, jobject initialElement );
/* <2>獲取數組元素,下面的函數通過Index指定的索引在array中獲取一個對象,如果索引超出邊界,會拋出一個IndexOutOfBoundsException*/
jobject GetObjectArrayElement(jobjectArray array, jsize Index);
/*<3>設置元素值。下面的函數在array中通過index指定的索引處設置元素值為value,如果index超出邊界,會拋出一個IndexOutOfBoundException*/
void SetObjectArrayElement(jobjectArray array, jsize index,jobject value);
(2)用於基本類型的數組的函數
| Type |
ArrayType |
NativeType |
| boolean |
jbooleanArray |
jboolean |
| byte |
jbyteArray |
jbyte |
| char |
jcharArray |
jchar |
| short |
jshortArray |
jshort |
| int |
jintArray |
jint |
| long |
jlongArray |
jlong |
| float |
jfloatArray |
jfloat |
| double |
jdoubleArray |
jdouble |
/*<1>創建數組,下面函數創建一個包含length個元素的Java數組:*/
[ArrayType] New[Type]Array(jsize length);
/* <2>獲取數組元素,下面的函數返回一個指向本機類型數組的指針,該類型與Java數據類型相對應。如果存儲器從Java代碼返回數組的一個副本,則參數isCopy被置為JNI_TRUE,否則置為JNI_FALSE:*/
[NativeType] *Get[Type]ArrayElements([ArrayType] array, jboolean *isCopy);
/*<3>釋放數組指針。下面的函數釋放從Get[Type]ArrayElements調用中獲得的存儲器空間。如果本機數組不是一個副本,那么模式(mode)參數可以被用來有選擇的從本機數組復制存儲器內容 回Java數組。模式的值以及它們的效果如下表:*/
void Release[Type]ArrayElements([ArrayType] array,[NativeType] *elems, jint mode);
| mode |
Effect |
| 0 |
從本機數組復制存儲器內容到Java數組,並且回收被本機數組使用的存儲器 |
| JNI_COMMIT |
從本機數組復制存儲器內容到Java數組,但是不回收被本機數組使用的存儲器 |
| JNI_ABORT |
不從本機數組復制存儲器內容到Java數組,但是回收被本機數組使用的存儲器 |
/*<4>其他操作
①下面的函數功能同Get[Type]ArrayElements很相似。但是,它只用於一個數組子集的復制操作。參數start指定了從何處復制的起始索引,參數len則指定了從數組中復制到本機數組的多個位置數量:*/
void Get[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);
/* ②下面的函數是Get[Type]ArrayRegion的一個副本。這個函數用來復制本機數組的一段內容回Java數組中。元素一般從本機數組起始處(索引為0)開始復制,但是只是從位置start開始將len個元素復制到Java數組中:*/
void Set[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);
/* ③下面的函數在獲得數組上的鎖后將返回一個句柄給數組。如果沒有建立任何鎖,則isCopy被置為JNI_TRUE,否則置為NULL或JNI_FALSE:*/
void *GetPrimitiveArrayCritical([ArrayType] array, jboolean *isCopy);
/*④下面的函數釋放從GetPrimitiveArrayCritical調用中返回的數組。mode的效果如下表:*/
void ReleasePrimitiveArrayCritical([ArrayType] array, void *carray, jint mode);
| mode |
Effect |
| 0 |
從carray中復制值到數組中,並釋放分配給carray的存儲器 |
| JNI_COMMIT |
從carray中復制值到數組中,但是不釋放分配給carray的存儲器 |
| JNI_ABORT |
不從carray中復制值到數組中 |
