Можно ли вызвать Java из Node.js через JNI? Есть ли примеры?
Могу ли я вызвать Java из Node.js через JNI и как?
Ответ 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
Ответ 7
Я думаю, что одобренный ответ немного устарел. Возможно, стоит попробовать: https://github.com/joeferner/node-java