Да обещает ошибки проглатывания, и вы можете поймать их только с помощью .catch
, как объяснено более подробно в других ответах. Если вы находитесь в Node.js и хотите воспроизвести нормальное поведение throw
, выполните трассировку стека стека на консоль и процесс завершения, вы можете сделать
...
throw new Error('My error message');
})
.catch(function (err) {
console.error(err.stack);
process.exit(0);
});
У Вас есть несколько опций:
Для изучения сокетов, поиск Google "учебное руководство по сокету Java" или "учебное руководство по сокету C++" даст Вам большую информацию.
Простой способ сделать это использует стандартный ввод и вывод:
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
Хотя ответ был принят, ключевой проблемой здесь является семантическое несоответствие между этими двумя языками: принятие Вас имеет своего рода потоковое продолжение соединения, как Вы эффективно обмениваетесь данными?
Одним решением, которое я мог бы рекомендовать, является Google Protocol Buffers. Это не решает проблему подпроцесса/JNI/сокета, но что это действительно делает, позволяют Вам, довольно эффективный способ иметь структуру сложного объекта передает транзитом по потоковому протоколу.
Помните: JNI является сложным, особенно для ссылок сложного объекта, но это эффективно. Самая важная вещь состоит в том, чтобы передать данные по тому эффективному контекстному переключению правильно. GPB+JNI/Sub-Process Сокет позволяет единственному контекстному переключению вытягивать данные, объединенный с эффективной поддержкой кодеков с обеих сторон.
Вы могли использовать Собственный интерфейс Java (JNI). JNI позволяет Вам выполнять вызовы к библиотекам C из JAVA-приложений. Обратите внимание, что вызовы JNI являются C и не вызовами C++, таким образом, необходимо будет указать соглашение о вызовах C по функциям C++ (экстерн "C").
JNI имеет репутацию быть твердым сделать. Это не легко, но это, конечно, выполнимо. Я был бы совет против использования сокетов. Используя сокеты походит на простой способ, но мне это эквивалентно открытию банки противных червей...
Опции, которые упомянул Dave, являются некоторыми наиболее распространенными подходами.
Как расширение решения JNI, Вы могли бы также посмотреть на прямой ByteBuffers (Java 1.4 и вперед), если у Вас есть некоторые необработанные данные, Вы хотите совместно использовать между Java и C++. Прямые буферы байта позволяют Вам выделять буфер некоторого размера или на C++ или на стороне Java и затем легко получать доступ к буферу с обоих языков; в Java это сделано через методы на объекте ByteBuffer, и в C++ можно получить указатель на данные. ByteBuffers удобны, если у Вас есть достойный объем информации для обмена, и Вы не хотите передавать все это как параметры в методе JNI.
подход сокета , вероятно излишество, но я не уверен, что Вы конкретно пытаетесь сделать.
Больше информации необходимо (но хороший вопрос).
эти две отдельных программы, работающие одновременно?
В противном случае и программа Java должен назвать библиотеку C++, ответ JNI является хорошим решением, но это не будет действительно работать через процессы.
В случае процессов, действительно необходимо найти способ передать через процессы... простое решение (вероятно, не лучшее, но я не знаю точная ситуация) должен был бы иметь двоичный файл, который записан в и считан из..., просто не забывают остерегаться условий состязания! Сокеты могли также работать, но если Ваши программы связываются много, это могло бы быть что-то вроде пожирателя ресурсов на мощности ЦП.
Кроме того, если это не потеряно в шуме, используйте БОЛЬШОЙ ГЛОТОК для помощи Вам при попытке маршрута JNI. http://www.swig.org/
Существует также опция SOAP, но это - вероятно, излишество, предполагающее, что Вы просто получили два процесса на той же машине. Тем не менее я упоминаю это ради полноты.