jdoubleArray和vector之间的转换<;双倍>;在C++; 我有一个C++ DLL,它包含了我需要在java程序中使用的方法。我已经阅读了所有关于JNI的Sun文档,以及在web上找到的许多教程,但我似乎找不到代码的问题。事实上,相当一部分代码是从各种教程和Sun网站上剪切和粘贴的 我的具体问题如下:我的C++原生方法从java程序中接收JDyLeLeRy,需要映射到C++向量,然后C++传递给C++ DLL中的一个方法。dll中的方法返回另一个向量,然后需要将该向量映射到新的jdoubleArray,并返回到Java程序。问题似乎是我没有正确地执行映射

jdoubleArray和vector之间的转换<;双倍>;在C++; 我有一个C++ DLL,它包含了我需要在java程序中使用的方法。我已经阅读了所有关于JNI的Sun文档,以及在web上找到的许多教程,但我似乎找不到代码的问题。事实上,相当一部分代码是从各种教程和Sun网站上剪切和粘贴的 我的具体问题如下:我的C++原生方法从java程序中接收JDyLeLeRy,需要映射到C++向量,然后C++传递给C++ DLL中的一个方法。dll中的方法返回另一个向量,然后需要将该向量映射到新的jdoubleArray,并返回到Java程序。问题似乎是我没有正确地执行映射,java,c++,java-native-interface,Java,C++,Java Native Interface,我的代码如下(为了简单起见,我删除了对dll方法的调用): JNIEXPORT jdoubleArray JNICALL Java_jniarray passing_jniarray passing_jniarray passAndReturn(JNIEnv*env,jclass jcls,jdoubleArray arr) { //首先获取一个指向jdoubleArray中元素的指针 jsize len=env->GetArrayLength(arr); jboolean isCopy1; j

我的代码如下(为了简单起见,我删除了对dll方法的调用):

JNIEXPORT jdoubleArray JNICALL Java_jniarray passing_jniarray passing_jniarray passAndReturn(JNIEnv*env,jclass jcls,jdoubleArray arr)
{
//首先获取一个指向jdoubleArray中元素的指针
jsize len=env->GetArrayLength(arr);
jboolean isCopy1;
jdouble*body=env->GetDoubleArrayElements(arr和isCopy1);
//创建向量并为映射保留足够的内存
std::vector newvector;
新向量保留区(len);
//将jdoubleArray的内容复制到向量
对于(int i=0;ireleasedoublearray元素(arr、body、JNI_ABORT);
}
//在此处调用dll方法。。。。
jdoubleArray输出=env->NewDoubleArray(newvector.size());
jboolean isCopy2;
jdouble*destrarylems=env->GetDoubleArrayElements(输出和isCopy2);
对于(int i=0;iReleaseDoubleArrayElements,arr,destArrayElems,0);
}
返回输出;
}
当我将body[I]的内容输出到控制台时,我得到一系列看起来非常像十六进制值的数字(例如003DFBE0),但它们都是相同的,所以我认为它们不能作为内存地址

返回的jdoubleArray的内容完全由默认的双精度值(即0.0)组成,我怀疑这是因为原始jdoubleArray的值无效

我需要知道的是


非常感谢您的帮助!

根据文档,
GetDoubleArrayElements
可能会返回 指向副本的指针,而不是指向实际数据的指针;这就是原因 例如,您需要调用
ReleaseDoubleArrayElements
复制,那么你看不到你写的值是正常的。 如果您使用的是
std::vector
,我会使用
GetDoubleArrayRegion
SetDoubleArrayRegion

jsize size = env->GetArrayLength( arr );
std::vector<double> input( size );
env->GetDoubleArrayRegion( arr, 0, size, &input[0] );

//  ...

jdoubleArray output = env->NewDoubleArray( results.size() );
env->SetDoubleArrayRegion( output, 0, results.size(), &results[0] );
jsize size=env->GetArrayLength(arr);
std::矢量输入(大小);
env->GetDoubleArrayRegion(arr,0,size,&input[0]);
//  ...
jdoubleArray输出=env->NewDoubleArray(results.size());
env->SetDoubleArrayRegion(输出,0,results.size(),&results[0]);

我认为这是初始化输出数组的唯一方法。

非常感谢,我知道我做错了什么!它现在工作得很好!
jsize size = env->GetArrayLength( arr );
std::vector<double> input( size );
env->GetDoubleArrayRegion( arr, 0, size, &input[0] );

//  ...

jdoubleArray output = env->NewDoubleArray( results.size() );
env->SetDoubleArrayRegion( output, 0, results.size(), &results[0] );