JNI访问数组的数组

时间:2018-06-14 18:47:18

标签: java c arrays multidimensional-array java-native-interface

我正在尝试为java中的不同排序算法编写基准,因为我想探索JNI的世界。 我试图对一组包含在数组中的int数组进行排序。 这是我的Java标题:

public static native void sort(int[][] c);

我用javah为它生成了这个C头:

JNIEXPORT void JNICALL Java_org_jku_ssw_prsw2_ue6_jni_JNISorter_sort (JNIEnv *env, jclass cls, jobjectArray objArr

然后我尝试用

获取数组的长度
jsize len = (*env)->GetArrayLength(env, objArr);

但是从这里我有点卡住了,我可以使用GetObjectArrayElement从这个数组中获取一个jobject元素,但是我如何从那里获取一个jint数组,然后我可以最终排序?

1 个答案:

答案 0 :(得分:1)

由于您知道您检索的jobject实际上是int[],因此您可以安全地将其转换为jintArray,然后从那里开始,例如:

JNIEXPORT void JNICALL Java_Main_sort(JNIEnv *env, jclass _, jobjectArray objArr) {
    jsize len = (*env)->GetArrayLength(env, objArr);

    for(int i = 0; i < len; i++) {
        jintArray arr = (jintArray) (*env)->GetObjectArrayElement(env, objArr, i);
        jsize innerLen = (*env)->GetArrayLength(env, arr);
        jint* vals = (*env)->GetIntArrayElements(env, arr, NULL);            

        /* make changes to 'vals' */

        (*env)->ReleaseIntArrayElements(env, arr, vals, JNI_COMMIT);
        (*env)->DeleteLocalRef(env, arr);
    }
}