передавать данные между Java и C - PullRequest
7 голосов
/ 01 декабря 2010

У меня есть структура C.

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

Я хочу отобразить данные из Java в эту структуру C. Как я могу сделать это с помощью JNI? Ява код не будет запрограммирован мной. Программист Java просто хочет знать, в какой форме он должен отправить мне данные? Должен ли он ожидать каких-либо подробностей

В настоящее время я тестирую свой код, заполняя экземпляр структуры файлом CSV, содержащим 2 столбца.

Я также хочу вернуть 3 двойных значения из моего кода C в приложение Java.

Ответы [ 5 ]

3 голосов
/ 01 декабря 2010

Если вы хотите использовать тот же тип "struct" на стороне java, я бы создал класс, соответствующий этой структуре (чтобы java и c-разработчик могли говорить об одном и том же):

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

Затем вам нужно скопировать значения из / в мир Java при входе в JNI. Вот пример того, как вы это делаете:

// 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 голосов
/ 01 декабря 2010

Вы, вероятно, можете заставить это работать с JNI, но лично я предпочел бы, чтобы у меня в глазах были горячие иглы, чем работать с JNI.Я лично считаю, что Java Native Access (JNA) намного проще в использовании.

2 голосов
/ 01 декабря 2010

Хотя в формате CSV нет ничего плохого в получении данных из разных программ, я склоняюсь к использованию XML для этого. Частично это субъективное предпочтение формата данных. С помощью XML вы можете определить надежную конструкцию, которую вы можете проверить, прежде чем читать в свою программу. И ИМХО, правильный XML-дизайн гораздо удобнее для отладки.

2 голосов
/ 01 декабря 2010

Предоставьте следующее объявление вашему 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);
1 голос
/ 01 декабря 2010

Использование стандартного контейнера данных, такого как CSV, абсолютно уместно. Существует множество бесплатных библиотек кодирования Java CSV, и то же самое относится и к C.

Ваш Java-программист все еще может использовать собственные структуры данных Java, все, что ему нужно сделать, это закодировать его в CSV (или другие форматы, такие как XML) и отправить его вам.

С вашей стороны все, что вам нужно сделать, это прочитать этот контейнер данных, используя некоторую библиотеку CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...