Могу ли я вызвать Java из Node.js через JNI и как?


2 Answers

Вы должны попробовать модуль 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 - создавать объекты, методы вызова, поля доступа и т. Д.

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

--- Дэйв

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

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

Question

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




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

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




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

https://github.com/jrgleason/NodeJSArduinoLEDController






Related