Java-классы в c структурах - PullRequest
2 голосов
/ 04 июля 2011

У меня есть два источника:

  • xml-файл, содержащий определения нескольких сотен структур данных, в основном состоит из полей, состоящих из простых типов данных (например, int, short, boolean, enum), и
  • заголовочный файл c, содержащий те же структуры данных, что и структуры c. (Я не могу изменить этот заголовочный файл или структуры c.)

У меня также есть библиотека, написанная на языке c, которая может использовать эти структуры c для выполнения определенной задачи.

Наконец, у меня есть Java-приложение, которому нужно как-то использовать эту библиотеку.

В настоящее время я генерирую Java-классы из xml-файла, представляющего структуры данных, теперь я "просто" должен как-то предоставить их библиотеке.

Мой текущий подход - генерировать jni-код, вызывать c-функцию для каждой структуры из Java, принимая сгенерированный класс Java в качестве параметра. Затем сгенерируйте c-код, который принимает классы Java, и заполните соответствующие поля в c-структурах.

Это хороший подход? У кого-нибудь есть предложения по более простому подходу?

Я рассматриваю возможность использования сокетов и, например, protobuf , но я не вижу в этом ничего проще.

Заранее спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Решение, которое я выбрал, заключается в использовании библиотеки Javolution struct

В основном я генерирую Java-классы, которые наследуют класс javolution.io.Struct из xml, и объявляю поля соответствующим образом, так что javolution может интерпретировать его как struct.

Это позволяет мне сделать myJavaStructClass.getByteBuffer() и получить непосредственно сопоставленный байтовый буфер , который имеет такую ​​же структуру памяти, как если бы Java "struct" была объявлена ​​в c. И поскольку он напрямую отображается, содержит ссылку, которая может быть передана непосредственно в собственный код через JNI .

Javolution также поддерживает как упакованные, так и неупакованные структуры, а также произвольную последовательность .

Другим решением будет использование SWIG для генерации классов Java непосредственно из заголовочных файлов c и управления ими напрямую в собственном коде через JNI .

0 голосов
/ 04 июля 2011

Вам не нужно использовать сокеты, чтобы получить значение из protobuf здесь.Сериализация в прямой байтовый буфер, передаваемый между C и Java через JNI.Это будет быстрее и приведет к написанию менее раздражающего кода.

Согласно комментарию, это все еще требует копирования кода между вашими структурами и структурами protobuf, но мне кажется, что несколько макросов CPP могли бы сделать это довольно кратким.Возможно, вы даже сможете создать генератор кода, который использует некоторую структуру данных protobuf;не исключено, что кто-то другой имеет.

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