分兩種情況:
(1)基本元素數組
(2)對象數組
(1)基本元素數組
(i)拷貝基本元素數組:
JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint buf[10];
jint i, sum = 0;
(*env)->GetIntArrayRegion(env, arr, 0, 10, buf); //arr-->buf
for (i = 0; i < 10; i++) {
sum += buf[i];
}
return sum;
}
GetIntArrayRegion的第三個參數0表示arr的起始索引,第四個參數10表示要拷貝的元素個數.
(ii)獲取基本元素數組的指針:
GetIntArrayElements/ReleaseIntArrayElements
JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint *carr;
jint i, sum = 0;
carr = (*env)->GetIntArrayElements(env, arr, NULL);
if (carr == NULL) {
return 0; /* exception occurred */
}
for (i=0; i<10; i++) {
sum += carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
return sum;
}
(2)對象數組
獲取/設置對象數組:
GetObjectArrayElement/SetObjectArrayElement
JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env,jclass cls,int size)
{
jobjectArray result;
int i;
jclass intArrCls = (*env)->FindClass(env, "[I"); //int[]!!!
if (intArrCls == NULL) {
return NULL; /* exception thrown */
}
result = (*env)->NewObjectArray(env, size, intArrCls,NULL);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
for (i = 0; i < size; i++) {
jint tmp[256]; /* make sure it is large enough! */
int j;
jintArray iarr = (*env)->NewIntArray(env, size);
if (iarr == NULL) {
return NULL; /* out of memory error thrown */
}
for (j = 0; j < size; j++) {
tmp[j] = i + j;
}
(*env)->SetIntArrayRegion(env, iarr, 0, size, tmp);
(*env)->SetObjectArrayElement(env, result, i, iarr);
(*env)->DeleteLocalRef(env, iarr);
}
return result;
}
如上代碼創建一個二維數組,如果size設置爲3,二維數組如下:
0 1 2
1 2 3
2 3 4
參考資料:
[1]The Java™ Native Interface Programmer’s Guide and Specification.pdf