Могу ли я вызывать Java из Node.js через JNI и как? - PullRequest
44 голосов
/ 19 января 2011

можно ли вызвать Java из Node.js через JNI ?Есть ли примеры?

Ответы [ 6 ]

106 голосов
/ 20 февраля 2012

Вы должны попробовать модуль node-java npm, который является хорошо написанной оболочкой над JNI.

node-jave, кажется, (пока) не получил широкого распространения, ноиграя с ним, я был впечатлен тем, насколько он прост и надежен.

Это так просто, как:

var list = java.newInstanceSync("java.util.ArrayList");
list.addSync("item1");
list.addSync("item2");
console.log(list.getSync(1)); // prints "item2"

Вы можете делать практически все с помощью встроенной JVM - создаватьобъекты, методы вызова, поля доступа и т. д.

Существует небольшое несоответствие импеданса между Node и Java, поэтому, если вы собираетесь взаимодействовать с чем-то сложным, я бы рекомендовал написать большинство ваших взаимодействий на Java ипредоставление более простого интерфейса через барьер Node / Java.Это просто облегчает отладку таким способом.

--- Dave

ps, RealWorldUseCase (tm): я работал в месте, где между протоколом был довольно сложный (и кодировался спагетти)несколько клиентов браузера и сервис на основе Java.Я написал довольно приятный тестовый набор, который использовал jsdom для размещения N имитированных браузеров и использовал node-java в качестве оболочки для кода сервиса Java.Было тривиально отключить транспортные интерфейсы, как в JS для клиентов, так и в Java для службы, поэтому, когда какая-либо из этих вещей отправляет сообщение, я собираю его и помещаю в очередь для вероятностной доставки намеченной цели.(т.е. я виртуализировал сеть).Таким образом, я мог бы выполнить полное моделирование нескольких клиентов, взаимодействующих с Java-сервисом и через него, и запустить все это в одном процессе без какой-либо проводной связи.А потом я мог делать забавные вещи, такие как преднамеренное изменение порядка доставки сообщений, чтобы убедиться, что код устойчив к ошибкам синхронизации.И когда была обнаружена ошибка, я зарегистрировал порядок сообщений и смог воспроизвести их, чтобы воспроизвести ошибку.О, и все это настроено и запускает довольно сложный сценарий с несколькими тысячами строк регистрации и заканчивается менее чем за 1 секунду за цикл.2 недели хорошо провели.Прикольные вещи.

Вариант использования RealWorld # 2: selenium-inproc - модуль, который упаковывает JAR-файл SeleniumRC, предоставляя интерфейс узла для тестирования автоматизации браузера без Selenium запустить еще один сервис localhost.

9 голосов
/ 19 января 2011

Это выглядит сложно.Node.JS работает на движке Google Chrome JavaScript V8 .Что вам нужно сделать, это создать привязку V8 C ++ ( v8 c ++ Crash Course показывает пример), которая запускает JVM и выполняет всю обработку JNI.

Я думаю, вылучше позволить JavaServer и Node.js обмениваться данными по сети (кто-то написал пример использования RabbitMQ для обмена сообщениями на основе сообщений Java / Node.js).Здесь JSON будет отличным форматом для обмена данными (если вы доверяете, что ваш Java-сервер производит правильный JSON, вы можете просто выполнить eval () в Node).

5 голосов
/ 06 января 2012

Связь может осуществляться child_process.

порождает новый процесс и выполняет класс Main.Этот основной класс возвращает вывод на консоль.поэтому данные доступны для события stdout data узла.

var cmd    = require('child_process').spawn('java', ['Main']);

cmd.stdout.on('data', function (data) {
  console.log('stdout: ' + data); // This will print string returned by Main class.
});
0 голосов
/ 10 мая 2012

Я думаю, что вы ищете нативное расширение для использования в качестве моста.Хотя у меня нет примера того, что вы говорите, у меня есть пример того, как вызвать расширение C ++, используя Node.JS

https://github.com/jrgleason/NodeJSArduinoLEDController

0 голосов
/ 19 января 2011

Интересно, возможно ли это вообще? но даже если это возможно, я думаю, что это трудно реализовать, и я уверен, что никто еще не сделал этого.

как насчет использования именованного канала для связи между процессами (java и node.js)?

0 голосов
/ 19 января 2011

Мне не известны все детали Node.js, но я предполагаю, что ваше упоминание JNI на самом деле является Java Native Interface. Можно использовать только JNI из Java, поэтому imho не имеет смысла обращаться к Java из JNI, если вы еще не в Java.

Может показаться, что это неправильный подход, и вам нужно найти в документации Node.js их главу по интеграции ...

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