JNI访问数组的数组

3

我正在尝试为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个回答

4

由于您知道检索到的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);
    }
}

那不是一个类型转换,而是一个函数调用。 - user207421
@EJP你是什么意思?jintArray arr = (jintArray) ...使用了一个转换。 - Jorn Vernee
1
你可能应该在 for 循环结束时添加 ( *env )->DeleteLocalRef( env, arr ); 调用。对于一个大的对象数组,你可能会填满本地引用表。请参见 https://dev59.com/6mAf5IYBdhLWcg3wyVB1。 - Andrew Henle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接