JNI访问数组的数组 [英] JNI accessing array of array

查看:81
本文介绍了JNI访问数组的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to write a benchmark for different sorting algorithms in java, for that I wanted to explore the world of JNI. I am trying to sort a set of int arrays which are contained in an array. This is my Java header:

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

我使用javah为其生成了C头:

I used javah to generate this C header for it:

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数组,然后可以对其进行最终排序呢?

but from here I'm kinda stuck, I can get a jobject element from this array using GetObjectArrayElement but how do I procceed from there to get a jint array which I can then finally sort?

推荐答案

由于您知道检索到的 jobject 实际上是 int [] ,因此可以安全地对其进行强制转换到 jintArray ,然后从那里去,例如:

Since you know the jobject you retrieve is actually an int[], you can safely cast it to a jintArray and then go from there e.g.:

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);
    }
}

这篇关于JNI访问数组的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆