Подтвердить что ты не робот

Каков наилучший способ передачи информации с java на С++?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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 output to c++ input
$ java MyTest | ./my_receive 

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Параметры, которые упоминал Дэйв, являются одними из наиболее распространенных подходов.

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

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

Ответ 6

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

Являются ли эти две отдельные программы запущенными одновременно?

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

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

Ответ 8

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

Ответ 9

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