Что лучший способ состоит в том, чтобы передать информацию от Java до C++?

Да обещает ошибки проглатывания, и вы можете поймать их только с помощью .catch, как объяснено более подробно в других ответах. Если вы находитесь в Node.js и хотите воспроизвести нормальное поведение throw, выполните трассировку стека стека на консоль и процесс завершения, вы можете сделать

...
  throw new Error('My error message');
})
.catch(function (err) {
  console.error(err.stack);
  process.exit(0);
});
18
задан Alex 20 January 2009 в 21:38
поделиться

8 ответов

У Вас есть несколько опций:

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

Для изучения сокетов, поиск Google "учебное руководство по сокету Java" или "учебное руководство по сокету C++" даст Вам большую информацию.

16
ответ дан 30 November 2019 в 08:16
поделиться

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

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 
6
ответ дан 30 November 2019 в 08:16
поделиться

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

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

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

4
ответ дан 30 November 2019 в 08:16
поделиться

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

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

1
ответ дан 30 November 2019 в 08:16
поделиться

Опции, которые упомянул Dave, являются некоторыми наиболее распространенными подходами.

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

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

1
ответ дан 30 November 2019 в 08:16
поделиться

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

эти две отдельных программы, работающие одновременно?

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

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

0
ответ дан 30 November 2019 в 08:16
поделиться

Кроме того, если это не потеряно в шуме, используйте БОЛЬШОЙ ГЛОТОК для помощи Вам при попытке маршрута JNI. http://www.swig.org/

0
ответ дан 30 November 2019 в 08:16
поделиться

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

0
ответ дан 30 November 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: