Каков наилучший способ передачи информации из Java в C ++? - PullRequest
18 голосов
/ 21 января 2009

У меня есть приложение Java, мне нужно передать некоторую информацию в программу C ++. Было предложено использовать для этого простое программирование сокетов. Это лучший способ? Если нет, каковы альтернативы? Если так, как я должен идти о изучении программирования сокетов?

Ответы [ 9 ]

16 голосов
/ 21 января 2009

У вас есть несколько вариантов:

  • Передача файла из Java в C ++. Это, наверное, самое простое. Его легко протестировать, и он не должен требовать сторонних библиотек на обоих концах.
  • Используйте розетки, как указано. В C ++, если вам требуется кроссплатформенное решение, библиотека, такая как ACE или boost , избавит вас от душевной боли
  • Используйте JNI для вызова с Java на C ++ или наоборот. Это, наверное, самый сложный, но самый производительный.

Для изучения сокетов, поиск Google для "учебник по java сокетам" или "учебник по c ++ сокетам" даст вам много информации.

6 голосов
/ 21 января 2009

Простой способ сделать это - использовать стандартный ввод и вывод:

class MyTest {
    public static void main(String... args) {
        System.out.println("carpet");
    }
} // Java

#include <iostream>
#include <string>
int main() {
    string input;
    std::getline(std::cin, input);
    std::cout << "from java: " << input << std::endl; // output: carpet
} // C++

# start by piping java's output to c++'s input
$ java MyTest | ./my_receive 
4 голосов
/ 21 января 2009

Несмотря на то, что ответ принят, ключевой проблемой здесь является семантическое несоответствие между двумя языками: если у вас есть какое-то соединение с потоком, как вы эффективно обмениваетесь данными?

Одно из решений, которое я мог бы порекомендовать, - это буфер протокола Google. Он не решает проблему с подпроцессом / JNI / сокетом, но он делает это достаточно эффективным способом передачи сложной объектной структуры через потоковый протокол.

Помните: JNI сложен, особенно для сложных ссылок на объекты, но он эффективен. Самое главное - правильно передать данные по этому эффективному переключению контекста. Разъем GPB + JNI / Sub-Process позволяет одному переключателю контекста передавать данные в сочетании с эффективной поддержкой кодеков с обеих сторон.

1 голос
/ 21 января 2009

Опции, упомянутые Дейвом, являются одними из самых распространенных.

В качестве расширения решения JNI вы также можете взглянуть на прямые ByteBuffers (Java 1.4 и выше), если у вас есть некоторые необработанные данные, которые вы хотите разделить между Java и C ++. Прямые байтовые буферы позволяют вам выделить буфер некоторого размера на стороне C ++ или Java, а затем легко получить доступ к буферу с обоих языков; в Java это делается с помощью методов объекта ByteBuffer, а в C ++ вы можете получить указатель на данные. ByteBuffers удобны, если у вас есть приличный объем информации для обмена, и вы не хотите передавать все это как параметры в методе JNI.

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

1 голос
/ 21 января 2009

Вы можете использовать собственный интерфейс Java (JNI). JNI позволяет вам звонить в библиотеки C из приложений Java. Обратите внимание, что вызовы JNI - это вызовы C, а не C ++, поэтому вам придется указать соглашение о вызовах C для ваших функций C ++ (extern "C").

У JNI сложная репутация. Это не легко, но, безусловно, выполнимо. Я бы посоветовал не использовать сокеты. Использование розеток кажется легким выходом, но для меня это равносильно открытию банки противных червей ...

0 голосов
/ 21 января 2009

Существует также опция SOAP , но это, вероятно, излишне, если вы просто имеете два процесса на одной машине. Тем не менее, я упоминаю это для полноты картины.

0 голосов
/ 21 января 2009

Кроме того, если это не потеряно в шуме, используйте SWIG, чтобы помочь вам, если вы попробуете маршрут JNI. http://www.swig.org/

0 голосов
/ 21 января 2009
0 голосов
/ 21 января 2009

Требуется больше информации (но хороший вопрос).

Эти две отдельные программы работают одновременно?

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

В случае процессов вам действительно нужно найти способ взаимодействия между процессами ... простое решение (возможно, не лучшее, но я не знаю вашей точной ситуации) будет иметь двоичный файл это написано и прочитано от ... только не забывайте остерегаться условий гонки! Сокеты также могут работать, но если ваши программы много общаются, это может немного подорвать мощность процессора.

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