如何使用JNI传输复合类型

时间:2014-03-20 20:44:22

标签: java android c++ java-native-interface

如果我在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?

1 个答案:

答案 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