【问题标题】:Can I call Java from Node.js via JNI and how?我可以通过 JNI 从 Node.js 调用 Java 吗?如何?
【发布时间】:2011-06-11 08:52:54
【问题描述】:

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

【问题讨论】:

标签: java node.js java-native-interface


【解决方案1】:

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

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

【讨论】:

  • 知道这一点很有趣。但我想网络访问至少要比 JNI 慢一个数量级。你不觉得吗?
  • 这取决于你想做什么。 JNI 方法需要大量的工作和调试(JNI 本身已经很痛苦,而且使用 V8 -> C++ -> JNI -> Java 会更糟)。
  • 如何使用redis作为你的队列层,一个更简单的解决方案。
  • 我更多的是考虑一个实际的消息队列,例如喜欢 ZeroMQ (zero.mq)
  • Dave 的回答 here (>60 upvotes) 应该是公认的答案,它谈到了 node-java npm 模块。
【解决方案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 服务交互并通过 Java 服务进行交互,并在一个进程中运行整个过程,而无需任何有线通信。然后我可以做一些有趣的事情,比如故意重新排序消息传递,以确保代码能够适应时间错误。当发现错误时,我记录了消息顺序,并且可以重现它们以重现错误。哦,整个过程设置并运行了一个非常复杂的场景,有几千行日志记录,每次运行不到 1 秒就完成了。 2 周用得很好。好玩的东西。

真实世界用例 #2:selenium-inproc - 一个封装 SeleniumRC JAR 文件的模块,为带有 Selenium 的浏览器自动化测试提供节点接口,而无需运行另一个 localhost 服务。

【讨论】:

  • 这是否适用于 Gurobi 等第三方库? gurobi.com
【解决方案3】:

我认为您正在寻找的是用作桥梁的本机扩展。虽然我没有你所说的示例,但我确实有一个关于如何使用 Node.JS 调用 C++ 扩展的示例

https://github.com/jrgleason/NodeJSArduinoLEDController

【讨论】:

    【解决方案4】:

    我想知道这是否可能。但即使有可能,我想它也很难实施,而且我确信还没有人这样做。

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

    【讨论】:

      【解决方案5】:

      我不了解 Node.js 的所有细节,但我假设您提到的 JNI 实际上是 Java 原生接口。一个人只能从 Java 中使用 JNI,所以如果您还没有使用 Java,那么从 JNI 访问 Java 是没有意义的。

      看来这是错误的方法,您需要搜索 Node.js 文档中的集成章节...

      【讨论】:

      • 其实JNI也涵盖了JVM调用,而不仅仅是Java的原生调用。
      • @software 僧侣,你的说法很正确,但是在 q 的 ctx 中,很难想象 node js 使用 jni 和它的所有 javaisms。
      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多