Java 如何使用JNI传输复合类型 如果在C++方面有结构(如:简化):

Java 如何使用JNI传输复合类型 如果在C++方面有结构(如:简化):,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,及 如何最有效地传输数据结构 更新: 假设我使用: public native double[] approximate(double[],int p,int n); GetArrayLength(数组); std::矢量输入(大小); env->GetDoubleArrayRegion(arr,0,size,&input[0]); 可以类似地创建返回值: vector<double> returnArray; ... jdoubleArray retVal = env->

如何最有效地传输数据结构

更新:

假设我使用:

public native double[] approximate(double[],int p,int n);
<如何处理C++的双[]-s?

看看这里:

这里列出了可以通过JNI接口在Java和C之间传递的唯一类型。不能传递C/C++结构或类。您可以传递java数组,但需要手动将其分解到stl容器中

更新: javah应该生成一个头文件,为您提供类型。对于上述本机函数,javah将生成如下内容:

JNIEXPORT jdoubleArray JNICALL Java_T_approximate
  (JNIEnv * env, jobject, jdoubleArray theArray, jint, jint);
然后,您可以创建一个向量:

jsize size = env->GetArrayLength( theArray);
std::vector<double> input( size );
env->GetDoubleArrayRegion( arr, 0, size, &input[0] );
jsize size=env->GetArrayLength(数组);
std::矢量输入(大小);
env->GetDoubleArrayRegion(arr,0,size,&input[0]);
可以类似地创建返回值:

vector<double> returnArray;
...
jdoubleArray retVal = env->NewDoubleArray( returnArray.size() );
env->SetDoubleArrayRegion( retVal, 0, returnArray.size(), &returnArray[0] );
return retVal;
向量返回数组;
...
jdoubleArray retVal=env->NewDoubleArray(returnArray.size());
env->SetDoubleArrayRegion(retVal,0,returnArray.size(),&returnArray[0]);
返回返回;
不幸的是,Oracle关于JNI函数的文档有点有限。有关更多信息,请查看此处:

如果您在Java端分配一个直接ByteBuffer,那么您可以使用一些方法从中读取和写入任意的基元类型序列,这些基元类型可以与本机端的结构定义相匹配。举个例子,如何做到这一点?
JNIEXPORT jdoubleArray JNICALL Java_T_approximate
  (JNIEnv * env, jobject, jdoubleArray theArray, jint, jint);
jsize size = env->GetArrayLength( theArray);
std::vector<double> input( size );
env->GetDoubleArrayRegion( arr, 0, size, &input[0] );
vector<double> returnArray;
...
jdoubleArray retVal = env->NewDoubleArray( returnArray.size() );
env->SetDoubleArrayRegion( retVal, 0, returnArray.size(), &returnArray[0] );
return retVal;