2つの状況があります:
(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の3番目のパラメーター0は、arrの開始インデックスを示し、4番目のパラメーター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;
}
上記のコードは2次元配列を作成します。サイズが3に設定されている場合、2次元配列は次のようになります。
0 1 2
1 2 3
2 3 4
参考資料:
[1] Java™NativeInterfaceプログラマーズガイドおよび仕様.pdf