在Java和C之间传递数据

我有一个C结构。

struct data{ double value1[50]; double value2[50]; int count; }; 

我想将数据从java映射到这个C结构。如何使用JNI? java代码不会由我编程。 java程序员只想知道他应该以哪种forms向我发送数据? 他是否应该期待更多细节

我目前正在通过使用包含2列的CSV文件填充结构实例来测试我的代码。

我还想从我的C代码返回3个double值到java应用程序。

向java程序员提供以下声明:

 public native double[] doData(double [] value1, double [] value2, int count); 

在您的c代码中,您将能够使用传递的参数填充结构。 JNI标题将如下所示:

 JNIEXPORT jdoubleArray JNICALL Java_package_className_doData(JNIEnv * , jobject, jdoubleArray , jdoubleArray, jint); 

如果你想在java方面使用相同类型的“struct”,我会创建一个对应于该结构的类(这样java和c开发人员可以讨论相同的事情):

 class JavaData { double value1[50]; double value2[50]; int count; }; 

然后,您需要在进入JNI时将值从/或复制到Java世界。 这是一个如何做到的例子:

 // get the class jclass javaDataClass = env->FindClass("JavaData"); // get the field id jfieldID countField = env->GetFieldID(javaDataClass, "count", "I"); // get the data from the field cData.count = env->GetIntField(jData, countField); ... (the rest of the parameters) 

虽然CSV格式从不同的程序接收数据没有任何问题,但我倾向于使用XML来完成它。 部分原因是对数据格式的主观偏好。 使用XML,您可以定义一个可在读入程序之前validation的健壮构造。 而恕我直言,适当的XML设计更易于阅读以进行调试。

你可能会让这个与JNI合作,但就个人而言,我宁愿在我的眼睛里留下热针而不是与JNI合作。 我个人觉得Java Native Access(JNA) 容易使用。

使用CSV等标准数据容器是完全合适的。 有大量的免费Java CSV编码库,C也是如此。

您的Java程序员仍然可以使用本机Java数据结构,他/她需要做的就是将其编码为CSV(或其他格式,如XML)并将其发送给您。

在您的最后,您所要做的就是使用一些CSV库读取此数据容器。