Java Node.jsから[〜#〜] jni [〜#〜]を呼び出すことができますか?例はありますか?
それはトリッキーに見えます。 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()するだけです)。
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を実行する必要なしサービス。
通信は、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.
});
私はそれがまったく可能かどうか疑問に思います。しかし、たとえそれが可能であっても、実装するのは難しいと思いますし、誰もまだそれをしていないと確信しています。
名前付きパイプ を使用してプロセス間で通信するのはどうですか(Javaとnode.js)?
あなたが探しているのは、ブリッジとして使用するネイティブ拡張です。あなたが言っていることの例はありませんが、Node.JSを使用してC++拡張機能を呼び出す方法の例はあります。
Node.jsのすべての詳細を知っているわけではありませんが、JNIについて言及しているのは、実際にはJava Native Interfaceです。まだJavaを使用していない場合は、JNIからJavaにアクセスしてください。
これは間違ったアプローチであり、Node.jsドコで統合の章を検索する必要があるようです...