如果我在c ++方面有结构,如(简化):
struct Point
{
double x;
double y;
double z;
}
和
struct BSpline
{
std::vector<Point> knot;
std::vector<Point> cp;
}
struct Curve
{
std::vector<Point> Points;
}
(结构有相应的java类)
从Java方面来说,我想使用它们(不完全是):
public native BSpline approximate(Curve);
如何最有效地传输数据结构?
更新:
假设我使用:
public native double[] approximate(double[],int p,int n);
如何处理c ++方面的double [] - s?
答案 0 :(得分:0)
看看这里:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
此处列出了您可以通过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] );
可以类似地创建返回值:
vector<double> returnArray;
...
jdoubleArray retVal = env->NewDoubleArray( returnArray.size() );
env->SetDoubleArrayRegion( retVal, 0, returnArray.size(), &returnArray[0] );
return retVal;
不幸的是,Oracle关于JNI功能的文档有点受限。在这里查看更多信息: jikesrvm.sourceforge.net/apidocs/latest/org/jikesrvm/jni/JNIFunctions.html