Проблема JNI SetDoubleArrayRegion
Я пробовал смотреть на кучу форумов, и, несмотря на множество настроек и повторного анализа, я немного застрял.
Я пытаюсь вернуть 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?
Ваше использование JNI выглядит правильно. Вы не нуждаетесь в "новом двойном [2]" в коде Java, так как вы немедленно заменяете это значение возвращаемым значением из rotateLeftRight.
Это может произойти, если назначения "jdouble" обрабатываются как целые типы, а не float с двойной точностью. Например, если вы сохранили 64-битный шаблон для целого числа 4 в двойном, вы увидите 0.0 при его печати. Попробуйте сохранить "4.0" вместо 4 или установить его на 4668012349850910720LL.