JNI SetDoubleArrayRegion проблема - PullRequest
       4

JNI SetDoubleArrayRegion проблема

1 голос
/ 18 августа 2010

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

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

    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.

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

РЕДАКТИРОВАТЬ - я могу добавить больше информации к этому. Я пытался сделать:

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

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

1 Ответ

0 голосов
/ 18 августа 2010

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

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

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