Как исправить код моего 2d массива, который будет передаваться в Java, использует JNI? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь передать массив из C ++ в Java.нет ошибок в компиляции.но не удалось запустить (сбой).когда я отлаживаю код, в коде возврата возникает ошибка

я пытаюсь реализовать этот код как вернуть массив c ++ char 2d с помощью JNI в JAVA

вот мой код

    JNIEXPORT jobjectArray JNICALL my_function();
    // ...
    // some code
    // ...

    // i want convert float point[3][2] to java

    jclass intArray1DClass = env->FindClass("[I");
    jclass intArray2DClass = env->FindClass("[[I");

     //  float point[3][2]
     jint sizeX = 3;
     jint sizeY = 2;


    jobjectArray array2D = env->NewObjectArray(
                sizeX, intArray2DClass, NULL);

    for (jint i = 0; i < sizeX; i++)
    {
        jobjectArray array1D = env->NewObjectArray(
                    sizeY, intArray1DClass, NULL);

        for (jint y = 0; y < sizeY; y++)
        {
            jfloatArray value = env->NewFloatArray(point[i][y]); // float point[3][2]
            env->SetObjectArrayElement(array1D, y, value);
        }

        env->SetObjectArrayElement(array1D, i, array1D);
    }

    return array2D;

и вот как я вызываю функцию из Java.это правильно?

     float[][] point = my_function()

спасибо

Обновление

Наконец я использую 1D массив, потому что его просто написать код.и в соответствии с 1D или 2D массивом, что быстрее? , мы должны использовать 1D массив

     jint sizeX = 6;

     jfloatArray array1D = env->NewFloatArray(sizeX);

     env->SetFloatArrayRegion(array1D, 0, sizeX, point);


     return array1D;

1 Ответ

2 голосов
/ 11 июля 2019

Во-первых, похоже, что вы объявляете массив массива Java, то есть int [][], а не float[][].

Во-вторых, почему вы устанавливаете jfloatArray в качестве элемента вашего массива?Это должно быть просто float.

В-третьих, в последней строке вы, вероятно, имели в виду env->SetObjectArrayElement(array2D, i, array1D);

В-четвертых, когда вы объявляете массив, вам нужно указать класс, который он содержит, поэтому для 2D-массива он содержит1D массив и для 1D массива он содержит только числа с плавающей точкой.

PS: связанный вопрос / ответ фактически возвращает трехмерный массив.Поэтому вам нужно уменьшить количество измерений в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...