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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вы должны попробовать 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 барьер. Это просто упрощает отладку.

--- Дэйв

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

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

Ответ 3

Связь может выполняться с помощью child_process.

создать новый процесс и выполнить основной класс. Этот основной класс возвращает вывод на консоль. поэтому данные доступны для события node 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.
});

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

https://github.com/jrgleason/NodeJSArduinoLEDController

Ответ 7

Я думаю, что одобренный ответ немного устарел. Возможно, стоит попробовать: https://github.com/joeferner/node-java