вызов java из кода c

#java #c #java-native-interface

#java #c #java-native-интерфейс

Вопрос:

Наша модель программирования выглядит следующим образом:

Код c предназначен для захвата событий системы в реальном времени (очень частых), а код Java выполняется как сервер для получения запроса. Когда происходит событие, зафиксированное кодом c, нам нужно отправить запрос в java code и дождаться ответа. Я пробовал JNI для вызова java из c, но, похоже, он застрял после запуска на несколько секунд. JNI необходимо инициализировать jvm и выполнить поиск обработчика в файле класса. Есть ли какой-либо лучший способ обмена данными между c и java? Могу ли я скомпилировать код Java в двоичный файл и связать его с кодом c? Спасибо

Ответ №1:

Возможно, вы захотите изучить использование сокетов, если задействована хорошая парадигма производитель-клиент / потребитель-сервер. Таким образом, C-код выполняется в фоновом режиме и отправляет информацию в службу Java через сокет-соединение, а службы Java, в свою очередь, отправляют ответы обратно в C-код. Вы также могли бы рассмотреть возможность использования FIFO или именованных каналов для обмена данными, но сокеты, по крайней мере, локально на компьютере, как правило, довольно быстры и эффективны на большинстве платформ.

Кроме того, служба Java может запускать C-код при запуске, если вам нужно работать таким образом, или наоборот (т.е. C-код может отключить виртуальную машину и запустить службу Java).

Ответ №2:

Если код Java выполняется как сервер, вам следует отправить ему запрос из кода C, который может находиться в другом процессе или даже на другой машине. Лично я бы не стал пытаться вызывать Java-код непосредственно из кода C, если бы для этого не было действительно веской причины.

Ответ №3:

Одним из вариантов является запуск Java-приложения в отдельном процессе и использование межпроцессных связей между java-приложением и сборщиком данных C.

Что касается компиляции Java и компоновки на C, это возможно, если ваш конкретный набор инструментов поддерживает это. Например, при использовании полнофункционального компилятора GNU gcc и gcj могут работать вместе, однако вам нужно понимать, что Java — это не просто язык, это также среда. Выполнение собственной компиляции Java может не предоставить вам никаких оснований для использования Java в системе.