Преобразование между JDOUBLEARRAY и Vector в методе java нативный (JNI) в C ++

У меня есть C ++ DLL, которая содержит методы, которые мне нужно использовать в программа Java. Я проходил через все солнечные документации на JNI, и многочисленные учебники, которые я нашел в Интернете, и я не могу найти проблему с моим кодом. Фактически, справедливая часть кода вырезана и вставлена ​​из различных учебных пособий и веб-сайта Солнца.

Моя особая проблема заключается в следующем: мой родной метод C ++ получает JDOUBLEARRay из моей программы Java, которая должна быть сопоставлена ​​на вектор C ++, который затем может быть передан в метод в C ++ DLL. Метод в DLL возвращает другой вектор, который затем должен быть сопоставлен на новый JDOUBLEARRAY и вернулся в программу Java. Проблема, кажется, я не выполняю сопоставление правильно.

Код, который у которого у меня будет следующим образом (я удалил вызов метода DLL для простоты):

JNIEXPORT jdoubleArray JNICALL Java_jniarraypassing_JNIArrayPassing_passAndReturn(JNIEnv *env, jclass jcls, jdoubleArray arr)
{
     //First get a pointer to the elements within the jdoubleArray
     jsize len = env->GetArrayLength(arr);
     jboolean isCopy1;
     jdouble *body = env->GetDoubleArrayElements(arr, &isCopy1);

     //Create the vector<double> and reserve enough memory for mapping
     std::vector<double> newvector;
     newvector.reserve(len);

     //Copy the contents of the jdoubleArray to the vector<double>
     for (int i=0; i<len; i++)
     {
        newvector.push_back(body[i]);
     }

     //Release the pointer to the jdoubleArray
     if (isCopy1 == JNI_TRUE)
     {
        env->ReleaseDoubleArrayElements(arr, body, JNI_ABORT);
     }

     //Call the dll method here....

     jdoubleArray output = env->NewDoubleArray(newvector.size());
     jboolean isCopy2;
     jdouble* destArrayElems = env->GetDoubleArrayElements(output, &isCopy2);
     for (int i=0; i<newvector.size(); i++)
     {
        destArrayElems[i] = newvector[i];
     }
     if (isCopy2 == JNI_TRUE) 
     {
            env->ReleaseDoubleArrayElements(arr, destArrayElems, 0);
     }

     return output;
 }

Когда я выводят содержимое корпуса [i] в ​​консоль, я получаю ряд номеров, которые выглядят Удивительно, как шестнадцатеричные значения (например, 003dfbe0), но они все одинаковы, поэтому я не думаю, что они могут быть адреса памяти.

Содержимое возвращенного jdoublearray полностью состоит из двойных значений по умолчанию (т.е. 0,0), что я подозреваю, это потому, что значения из исходного jdoublearray недействительны?

Что мне нужно узнать, это

любая помощь будут оценены!

6
задан Ryan van den Bergh 6 September 2011 в 10:04
поделиться