Java の配列にアクセスする

Java で生成した整数 (int) の配列は、Native Method では、jintArray と表現する。例えば、

JNIEXPORT jboolean JNICALL
Java_ArrayTest_sum(JNIEnv *env, jobject obj, jintArray args) {
のような Native Method を作るとする。配列 args の要素の数を知りたければ、Java の Array.length のような関数が用意されている。
jsize len = (*env)->GetArrayLength(env, args);
とする。jsize は、typedef jint jsize; と定義されている。C でいうところの size_t のようなものだろう。

実際に配列の要素にアクセスしたければ、配列への参照に変換する。変換後は普通に要素へアクセス出来る。

jint *array = (*env)->GetIntArrayElements(env, args, 0);
for (i=0; i<len; i++) {
    hogehoge(array[i]);
}
JNI は、配列のコピーを作って操作するので、元の配列オブジェクトが Java の GC によって回収されても、Native 側では残ってしまう。そのため利用しなくなった配列を解放する必要がある。
(*env)->ReleaseIntArrayElements(env, args, array, 0);
第4引数は、配列を操作した結果を Java 側に書き戻すかどうかのモードを指定する。0 は、書き戻して array を解放する。