web-dev-qa-db-ja.com

JNIを介してNode.jsからJavaを呼び出すことができますか?

Java Node.jsから[〜#〜] jni [〜#〜]を呼び出すことができますか?例はありますか?

44
Kay Pale

それはトリッキーに見えます。 Node.JSはGoogleで実行されますChrome JavaScriptエンジン V8 。V8 C++バインディングを作成する必要があります( v8 c ++ Crash Course は、JVMを起動し、すべてのJNI処理を行う例を示しています。

JavaServerとNode.jsがネットワーク経由で通信できるようにした方が良いと思います(誰かが RabbitMQの使用例 Java/Node.jsメッセージベースの通信用に書いた)。ここで、JSONは優れたデータ交換フォーマットになります(Javaサーバーが適切なJSONを生成する場合、Nodeでeval()するだけです)。

9
Daff

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とやり取りする複数のクライアントの完全なシミュレーションを実行できます=サービス、すべての通信を有線通信なしの単一プロセス内で実行し、その後、メッセージ配信を意図的に並べ替えるなど、コードがタイミングバグに対して回復力があることを確認するなど、楽しいことができました。メッセージの順序が記録され、バグを再現するためにそれらを再現することができました。ああ、全体がセットアップされ、数千行のロギングとfでかなり複雑なシナリオを実行しました実行ごとに1秒未満で終了します。よく過ごした2週間。楽しいもの。

RealWorldユースケース#2: Selenium-inproc -ブラウザオートメーションテストにノードインターフェイスを提供するSeleniumRC JARファイルをラップするモジュール Selenium さらに別のlocalhostを実行する必要なしサービス。

106
Dave Dopson

通信は、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.
});
5
Yogesh Agrawal

私はそれがまったく可能かどうか疑問に思います。しかし、たとえそれが可能であっても、実装するのは難しいと思いますし、誰もまだそれをしていないと確信しています。

名前付きパイプ を使用してプロセス間で通信するのはどうですか(Javaとnode.js)?

0
Alfred

あなたが探しているのは、ブリッジとして使用するネイティブ拡張です。あなたが言っていることの例はありませんが、Node.JSを使用してC++拡張機能を呼び出す方法の例はあります。

https://github.com/jrgleason/NodeJSArduinoLEDController

0
Jackie

Node.jsのすべての詳細を知っているわけではありませんが、JNIについて言及しているのは、実際にはJava Native Interfaceです。まだJavaを使用していない場合は、JNIからJavaにアクセスしてください。

これは間違ったアプローチであり、Node.jsドコで統合の章を検索する必要があるようです...

0
mP.