Node.jsからJavaを呼び出すにはJNI?例はありますか?JNI経由でNode.jsからJavaを呼び出すことはできますか?
答えて
これは難解です。 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()することができます)。
それを知って面白い。しかし、私はネットワークアクセスが、JNIよりも少なくとも1桁遅くなければならないと考えています。あなたは思いませんか? –
あなたのやりたいことによって異なります。 JNIのアプローチは、たくさんの作業であり、デバッグするのは難しいでしょう(JNIだけではすでに痛みがあり、V8 - > C++ - > JNI - > Javaの場合はさらに悪化します)。 – Daff
キューイングレイヤーとしてredisを使用すると、より簡単な解決方法が得られます。 –
私はNode.jsのすべての詳細を認識していませんが、私はあなたのJNIの言及が実際にJavaネイティブインタフェースであると仮定しています。 JavaからのJNIしか使えないので、まだJavaに入っていなければ、JNIからJavaにアクセスするのは意味がありません。
すべてで可能であるならば、私は疑問に思う
実際、JNIはJavaからのネイティブ呼び出しだけでなく、JVM呼び出しもカバーしています。 –
@software monk、あなたの声明はかなり正しいですが、qのctxでは、すべてのJava言語でjniを使用するノードjを想像するのは難しいです。 –
...これは間違ったアプローチで、あなたは彼らの統合の章のためのNode.jsのDOCOを検索する必要があるように思われます。たとえ可能であっても実装が難しいと私は想像していますが、誰もまだそれをしていないと確信しています。
named pipeをプロセス(javaとnode.js)間でやりとりする方法はありますか?
通信は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.
});
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ファイルをラップするモジュール。
これは正解です。 – Ventura
これはGurobiなどのサードパーティのライブラリでも機能しますか? http://www.gurobi.com/ –
あなたが探しているものは、ブリッジとして使用するネイティブの拡張機能だと思います。私はあなたが何を言っているかの例を持っていませんが、私はNode.jsの
私が承認答えは少し古いと思いを使用してC++拡張を呼び出す方法の例を持っています。 https://github.com/joeferner/node-java
- 1. JPA(JAVA)経由でストアドファンクションを呼び出すことはできますか?
- 2. JNI経由でAndroidのC++からJava関数を呼び出す
- 3. JNIが呼び出すCプログラムからC関数を呼び出すことはできますか?
- 4. Webサービス経由でリモートコンピュータで呼び出すことはできますか?
- 5. ksoap2経由でAndroidからJava Webサービスを呼び出す
- 6. JNIからJavaメソッドを呼び出すと、プログラムがクラッシュする
- 7. Javaから呼び出されたBoost C++ファイバーへのJNI呼び出しを作成できますか?
- 8. Javaでprintlnを呼び出すことはできますか?
- 9. 別のスレッドからJNI経由で保存されたJavaオブジェクトを呼び出す
- 10. php long intからjava longに失敗しましたhessian経由でJavaを呼び出すとき
- 11. Unity3D経由でnode.jsのjavascript関数を呼び出していますか?
- 12. java -jar myjar.jarからjythonスクリプトを呼び出すことはできますか?
- 13. Javaからwso2メッセージブローカーAPIを呼び出すことはできますか?
- 14. htmlテキストボックスからjava関数を呼び出すことはできますか?
- 15. Javaクラスからアンドロイドクラスを呼び出すことはできますか?
- 16. リモートデスクトップ経由でプログラムを実行すると、クライアントコンピュータ上のプログラムを呼び出すことはできますか?
- 17. HTTPS経由でWebサービスを呼び出すことができません
- 18. https経由でlocalhostからapiを呼び出す方法
- 19. Wscript.Shell経由でHTAからMSG.exeを呼び出す
- 20. ACTをslug経由で別のCPTから呼び出す
- 21. LinuxマシンからSSH経由でfirefoxを呼び出す方法
- 22. 外部からPython経由でgrassモジュールを呼び出す
- 23. 32ビットアプリケーションからCOM経由でx64アセンブリを呼び出す
- 24. Excelマクロ/ ExcelソルバーをPythonからcom経由で呼び出す
- 25. ABAPからSAP JCO 3経由でJavaを呼び出す方法
- 26. SWT Browser/SWT BrowserFunction経由でGWTアプリからJavaメソッドを呼び出す
- 27. 静的ライブラリをJNI経由でJavaにリンクすることはできますか?
- 28. SSLなしでHTTP経由で統一エンジンAPIを呼び出すことはできますか?
- 29. JavaからC++関数を呼び出すJNI - Cocos2d-x
- 30. Java JNI呼び出しライブラリロード
'Node.js'はJavaスクリプトファイルと思われ、JNIはネイティブ機能にアクセスするために使用されています。 –
Node.jsではなくRhinoを使用することができます簡単に:https://developer.mozilla.org/en-US/docs/Scripting_Java –