我可以通过JNI从Node.js调用Java吗?

我可以通过JNI从Node.js调用Java吗? 有没有例子?

这看起来很棘手。 Node.JS在Google Chrome JavaScript引擎V8上运行 。 你将不得不做的是创build一个V8 C ++绑定( v8 c ++崩溃课程显示一个例子),它启动一个JVM并执行所有的JNI处理。

我认为让JavaServer和Node.js通过networking进行通信可能会更好(有人写了一个使用RabbitMQ for Java / Node.js基于消息的通信的例子 )。 在这里,JSON将是一个很好的数据交换格式(如果您相信您的Java服务器生成正确的JSON,您可以在Node中对其进行评估)。

你应该尝试使用JNI编写的node-java npm模块。

node-jave似乎还没有被广泛采用,但是玩起来却让我印象深刻。

这很简单:

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

您可以使用embedded式JVM执行任何操作 – 创build对象,调用方法,访问字段等。

Node和Java之间有一个很小的阻抗不匹配,所以如果你打算和一些复杂的事情交互,我build议你写大部分的交互方式在Java中,并且在Node / Java方面暴露一个更简单的接口。 这只是使得debugging更容易。

—戴夫

ps,RealWorldUseCase(tm):我在一个地方有一个非常复杂的(和意大利面代码)协议在多个浏览器客户端和基于Java的服务之间。 我写了一个非常漂亮的testing工具,它使用jsdom来托pipeN个模拟浏览器,并使用node-java作为Java服务代码的包装。 在JS中为客户端提供传输接口是微不足道的,在Java中为服务提供传输接口是微不足道的,因此无论何时这些事情都会发送消息,我将其捕获并将其保存在一个队列中,以便将其交付给预期的目标(即,我虚拟化了networking)。 通过这种方式,我可以对多个客户端进行全面仿真,并通过Java服务进行交互,并在一个进程中运行整个过程,而无需任何有线通信。 然后,我可以做一些有趣的事情,例如故意重新排列消息传递,以确保代码能够适应错误。 当发现错误时,我将消息顺序logging下来,并可以重现错误。 噢,整个事情成立起来,运行了一个非常复杂的情况下,有几千行日志logging,并在每次运行1秒内完成。 花了2周的时间。 好玩的东西。

RealWorld使用案例#2: selenium-inproc – 一个封装了SeleniumRC JAR文件的模块,它提供了一个节点接口,用于无需运行另一个本地主机服务的Selenium浏览器自动化testing。

通信可以通过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. }); 

我不知道Node.js的所有细节,但我认为你提到的JNI实际上是Java本地接口。 一个人只能使用Java的JNI,所以如果你不在java中,那么从JNI访问Java是没有意义的。

这似乎是错误的方法,你需要searchNode.js DOCO的集成章节…

我想知道是否有可能。 但即使有可能,我想也很难实现,我相信没有人做到这一点。

如何使用命名pipe道进程之间进行通信(java和node.js)?

我认为你正在寻找的是一个本地扩展,以此作为桥梁。 虽然我没有一个你在说什么的例子,但是我有一个关于如何使用Node.JS调用C ++扩展的例子

https://github.com/jrgleason/NodeJSArduinoLEDController

我认为获得批准的答案有点老了。 这可能值得尝试: https : //github.com/joeferner/node-java