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

2022-08-31 22:43:08

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


答案 1

你应该试试 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用例#2:selenium-inproc - 一个包装SeleniumRC JAR文件的模块,为浏览器自动化测试提供节点接口,而无需运行另一个本地主机服务。


答案 2

这看起来很棘手。Node.JS在Google Chrome JavaScript引擎V8上运行。您所要做的是创建一个 V8 C++绑定(v8 c++ 速成教程显示了一个示例),该绑定将启动一个 JVM 并执行所有 JNI 处理。

我认为你最好让JavaServer和Node.js通过网络进行通信(有人写了一个使用RabbitMQ进行Java / Node的示例.js基于消息的通信)。在这里,JSON将是一个很好的数据交换格式(如果你相信你的Java服务器会产生正确的JSON,你可以在Node中eval()它)。


推荐