2011-01-18 8 views
44

Node.jsからJavaを呼び出すにはJNI?例はありますか?JNI経由でNode.jsからJavaを呼び出すことはできますか?

+1

'Node.js'はJavaスクリプトファイルと思われ、JNIはネイティブ機能にアクセスするために使用されています。 –

+1

Node.jsではなくRhinoを使用することができます簡単に:https://developer.mozilla.org/en-US/docs/Scripting_Java –

答えて

7

これは難解です。 Node.JSはGoogle Chrome JavaScriptエンジンV8で動作します。あなたがしなければならないことは、JVMを開始し、すべてのJNI処理を行うV8 C++バインディング(例:v8 c++ Crash Course)を作成することです。

JavaServerとNode.jsがネットワークを介して通信する方が良いかもしれないと思います(誰かがJava/Node.jsメッセージベースの通信用にexample for using RabbitMQを書きました)。ここで、JSONは優れたデータ交換形式になります(Javaサーバーが適切なJSONを生成することを信頼すれば、ノードでeval()することができます)。

+1

それを知って面白い。しかし、私はネットワークアクセスが、JNIよりも少なくとも1桁遅くなければならないと考えています。あなたは思いませんか? –

+4

あなたのやりたいことによって異なります。 JNIのアプローチは、たくさんの作業であり、デバッグするのは難しいでしょう(JNIだけではすでに痛みがあり、V8 - > C++ - > JNI - > Javaの場合はさらに悪化します)。 – Daff

+0

キューイングレイヤーとしてredisを使用すると、より簡単な解決方法が得られます。 –

0

私はNode.jsのすべての詳細を認識していませんが、私はあなたのJNIの言及が実際にJavaネイティブインタフェースであると仮定しています。 JavaからのJNIしか使えないので、まだJavaに入っていなければ、JNIからJavaにアクセスするのは意味がありません。

すべてで可能であるならば、私は疑問に思う

+7

実際、JNIはJavaからのネイティブ呼び出しだけでなく、JVM呼び出しもカバーしています。 –

+0

@software monk、あなたの声明はかなり正しいですが、qのctxでは、すべてのJava言語でjniを使用するノードjを想像するのは難しいです。 –

0

...これは間違ったアプローチで、あなたは彼らの統合の章のためのNode.jsのDOCOを検索する必要があるように思われます。たとえ可能であっても実装が難しいと私は想像していますが、誰もまだそれをしていないと確信しています。

named pipeをプロセス(javaとnode.js)間でやりとりする方法はありますか?

5

通信は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. 
}); 
101

node-java npmモジュールは、JNI上によく書かれたラッパーです。

node-javeは(まだ)幅広い採用をしていませんが、それを再生していますが、私はどのように簡単で堅牢であることに感銘を受けました。

それは同じくらい簡単です:あなたはあなたの埋め込まれたJVMで何でもちょうど行うことができます

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

- などのオブジェクト、メソッドのコール、アクセスフィールドを作成

ノード間のわずかなインピーダンス不整合がありますJavaの場合は、複雑なものとやりとりする場合は、Javaでの対話のほとんどを記述し、ノード/ Javaバリア全体でより簡単なインタフェースを公開することをお勧めします。そう簡単にデバッグするだけです。

---デイブ

P.S.、RealWorldUseCase(TM):私は、複数のブラウザクライアントとの間にはかなり複雑な(とスパゲッティコード化された)プロトコルおよびJavaベースのサービスを持っていた場所で働いていました。私はjsdomを使用してN個のシミュレートされたブラウザをホストし、node-javaをJavaサービスコードのラッパーとして使用したかなり甘いテストハーネスを作成しました。クライアント用のJSとサービス用のJavaの両方で、トランスポート・インターフェースをシム・アウトするのは簡単でした。したがって、これらのもののいずれかがメッセージを送信するときはいつでも、それをキャプチャしてキューに入れて、意図したターゲットに確率的に配信します(つまり、私はネットワークを仮想化しました)。このようにして、Javaサービスと相互作用する複数のクライアントの完全なシミュレーションを実行し、ワイヤ通信なしですべての処理を単一のプロセス内で実行できます。そして、コードがタイミングバグに対して弾力性を持っていることを確認するために、故意にメッセージ配信を並べ替えるような楽しいことをすることができました。そして、バグが発見されたとき、私はメッセージの順序を記録し、それらを再現してバグを再現することができました。ああ、すべてのことがセットアップされ、数千行のログを記録したかなり複雑なシナリオを実行し、実行ごとに1秒未満で終了しました。 2週間を費やしました。面白いもの。

RealWorldユースケース#2:selenium-inproc - もう1つのlocalhostサービスを実行することなく、ブラウザ自動化テストw/Seleniumにノードインタフェースを提供するSeleniumRC JARファイルをラップするモジュール。

+6

これは正解です。 – Ventura

+0

これはGurobiなどのサードパーティのライブラリでも機能しますか? http://www.gurobi.com/ –

関連する問題