我有一个C结构。
struct data{
double value1[50];
double value2[50];
int count;
};
我想将数据从java映射到此C结构。如何使用JNI进行操作? java代码不会由我编程。 java程序员只想知道他应该以哪种形式向我发送数据?他是否应该期待更多细节
我目前正在通过使用包含2列的CSV文件填充结构实例来测试我的代码。
我还想从我的C代码向java应用程序返回3个double值。
答案 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库读取此数据容器。