У меня есть 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 недействительны?
Что мне нужно узнать, это
любая помощь будут оценены!