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;