単一のJVMアプリ(1つのプロセス、場合によっては複数のスレッド)とC++dllにリンクされたネイティブC++アプリケーションの間に堅牢なIPCソリューションを実装したいと思います。dllは、同じ物理マシン上にある場合とない場合があります。そうするための最良のアプローチは何ですか?
どんな提案でも大歓迎です!ありがとう!
私は標準のTCP/IPソケットを使用します。この場合、アプリはあるポートでリッスンし、ライブラリはそれに接続して、報告する必要があるものを報告し、回答を期待します。
抽象化は堅牢で、十分にサポートされており、相互運用の問題はありません。
FacebookのThriftフレームワークを検討しましたか?
Thriftは、スケーラブルなクロスランゲージサービス開発のためのソフトウェアフレームワークです。ソフトウェアスタックとコード生成エンジンを組み合わせて、C ++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk、OCamlの間で効率的かつシームレスに機能するサービスを構築します。
Thriftを使用すると、単純な定義ファイルでデータ型とサービスインターフェイスを定義できます。そのファイルを入力として、コンパイラは、プログラミング言語間でシームレスに通信するRPCクライアントとサーバーを簡単に構築するために使用されるコードを生成します。
TCPソケット上で機能し、シリアル化/逆シリアル化はすでに組み込まれています。
詳細については、ホワイトペーパーをお読みください。
Google プロトコル バッファは、言語とプラットフォームに依存しない方法でデータをシリアル化するのに役立ちます。また、シリアル化されたデータの読み取りと書き込みを処理するコードを Java および C++ で生成します。その後、データを送信する任意の通信メカニズムを使用できます。たとえば、TCP ソケットまたは共有メモリ IPC 経由で送信できます。
うーん - DLL はプロセスではないので、Java アプリと DLL にリンクされている他のネイティブ アプリケーションとの間の IPC を意味していると思います。確かに、ソケットはここに行く方法です。それはあなたにとってすべてをより簡単にします。
もう 1 つのオプションは、JNI を使用して DCOM 実装と通信することですが、(COM と JNI の頭痛の種に対処する必要があることを除いて :-) )、多くのメリットはないと思います。