在Java和C之间传递数据

时间:2010-12-01 13:30:02

标签: java c java-native-interface

我有一个C结构。

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

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

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

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

5 个答案:

答案 0 :(得分:3)

如果你想在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)

答案 1 :(得分:2)

向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);

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

最后,您只需使用一些CSV库读取此数据容器。