【问题标题】:pass data between Java and C在 Java 和 C 之间传递数据
【发布时间】:2010-12-01 13:30:01
【问题描述】:

我有一个 C 结构。

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

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

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

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

【问题讨论】:

  • 在 Java 方面,JNA 是另一个比 JNI 更易于使用的选项。也许它也会使 C 通信更容易。 jna.dev.java.net

标签: java c java-native-interface


【解决方案1】:

如果你想在 java 端使用相同类型的“结构”,我会创建一个对应于该结构的类(以便 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)

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 为什么会被否决?我看不出帖子有什么问题。
      【解决方案4】:

      你可能可以让它与 JNI 一起工作,但就个人而言,我宁愿让热针刺在我的眼睛里,也不愿与 JNI 一起工作。我个人认为 Java Native Access (JNA) 更易于使用。

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 一旦你开始拥有任何类型的分层数据,我认为 JSON 值得考虑。当然,用JNA/JNI以structs的形式在Java和C之间携带数据可能会更快……
        猜你喜欢
        • 1970-01-01
        • 2011-05-03
        • 2017-03-28
        • 2014-06-29
        • 2018-02-07
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多