Проблема JNI SetDoubleArrayRegion

62
6

Я пробовал смотреть на кучу форумов, и, несмотря на множество настроек и повторного анализа, я немного застрял.


Я пытаюсь вернуть jdoubleArray через JNI из моего кода на С++, но значения, которые я, кажется, вступаю, похоже, не переносятся. Вот код.


    jdoubleArray ret = env->NewDoubleArray(2);

jdouble* rotationsJ = (jdouble *) malloc(2*sizeof(jdouble));
rotationsJ[0] = 4; //whatever, some dummy values.
rotationsJ[1] = 4;

cout<<"Rotations 0..."<<rotationsJ[0]; //Java console tells me this is 4, as it should.
env->SetDoubleArrayRegion(ret, 0, 2, (const jdouble*)rotationsJ);

return ret;
//EDIT - my java code looks like the following
double[] rotations = new double[2];

rotations = pnMain.rotateLeftRight(true); //PNMain is the calling class, rotateLeftRight returns a jDoubleArray.
//Was wondering if my Java declaration of rotations is needed?


Теперь в коде Java возвращаемый массив из кода C обнуляется. Я не могу изменить его значения. Я бы подумал, что использование функции SetDoubleArrayRegion (надеюсь) заставит массив "ret" иметь содержимое rotationsJ, но это не работает. Я просто получаю массив из двух элементов, значения которых равны 0.0, которые передаются мне обратно в Java.


Любая помощь/вопросы приветствуются.


EDIT - я могу добавить к этому дополнительную информацию. Я пробовал:


    jboolean isCopy; 
jdouble* test = env->GetDoubleArrayElements(ret, &isCopy);
cout<<"Test ..."<<test[1]; //This actually printed out the second element value in Java.

Итак, дополнительный оператор печати, который я решил опробовать - я копирую то, что я пытаюсь вернуть в другой буфер на C, и просто попробуйте распечатать его. Это фактически отражает значение, будучи настроенным только с использованием "ret". Может ли быть какая-то проблема в операторе return/в настройке кода Java?

спросил(а) 2021-01-19T14:36:10+03:00 2 месяца, 3 недели назад
1
Решение
123

Ваше использование JNI выглядит правильно. Вы не нуждаетесь в "новом двойном [2]" в коде Java, так как вы немедленно заменяете это значение возвращаемым значением из rotateLeftRight.

Это может произойти, если назначения "jdouble" обрабатываются как целые типы, а не float с двойной точностью. Например, если вы сохранили 64-битный шаблон для целого числа 4 в двойном, вы увидите 0.0 при его печати. Попробуйте сохранить "4.0" вместо 4 или установить его на 4668012349850910720LL.

ответил(а) 2021-01-19T14:36:10+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема