この質問を読んでくれてありがとう。
私は、C++ で書かれたバックエンド コードと統合するためにフロント エンドとして GUI を必要とするこの宿題をやっています。
クロスプラットフォーム機能と強力なグラフィック コンポーネントとして、このフロント エンド GUI を Java で作成したいと考えています。
Java と C++ をうまく統合できる良い方法はありますか?
ありがとうございました
Swigは非常にうまく機能します。これは、C/C++ を多種多様な言語にバインドする手段です。私はこれを使って C++ と会話した経験があり、その経験はほとんどありません。これは、 Swig と Java を一緒に使用するためのマニュアル ページです。このチュートリアルでは、Java を含む多くの例を使用して、非常に迅速に作業を進めることができます。
ただし、C++ バックエンドを Java フロントエンドから分離するために、アプリケーションをクライアント/サーバー アーキテクチャに分割することを検討します。C++/Java の開発と統合の苦痛を回避できます = ただし、要件に応じてフロントエンドとバックエンドの間で通信プロトコルを実装する必要があります (例: 基本的なソケット / Web サービス / HTTP+REST または CORBA - これはネイティブに付属しています)。 Java であり、言語間の通信用に設計されています)。
あなたがバックエンドコンポーネントであると仮定すると、他の人が説明しているように、インターフェイスレイヤーを使用できます。
これらはすべて、dllでc ++バックエンドを使用できるようにする必要があり、通常はC関数および場合によってはc++クラス用のJavaプロキシを提供します。これらすべてに学習曲線があり、プロキシを有効にするための作業もあります。
別のアプローチは、c ++プロセスを使用し、いずれかを使用してこれと通信することです。
ネットワークを介した通信をサポートしたい場合
これらには学習曲線といくつかのセットアップコストもあります
これらのうち、コマンドラインまたはstdin / stdoutは、最小限の労力と知識で作業を開始するのにおそらく最速です。ただし、各メッセージの入力と出力をテキストとしてエンコードする必要があるため、大規模なインターフェイスには適切に拡張できません。
オプションのコマンドラインスイッチを使用してc++プロセスを実行するコマンドラインアプローチの場合、結果はプロセス標準出力またはその終了コードから読み取られます。
stdin / stdoutの場合、プロセスを開始すると、各要求がプロセスのstdinに送信され、結果がstdoutから読み取られます。
JNI(Java Native Interface)を見てください。SunはJNIに関するオンラインブックを持っています。
リサイクルはどうですか?
Thriftは、スケーラブルなクロスランゲージサービス開発のためのソフトウェアフレームワークです。ソフトウェアスタックとコード生成エンジンを組み合わせて、C ++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk、OCamlの間で効率的かつシームレスに機能するサービスを構築します。
C++ バックエンド ライブラリを自分で作成するのではなく、サード パーティのライブラリを使用したい場合は、JNAを使用することをお勧めします。
この場合、JNI よりも JNA を使用する主な利点は、ブリッジ コードがすべて Java で記述されていることです (ネイティブ言語ではなく、この場合は C++)。つまり、C++ JNI インターフェースを作成してビルド プロセスを複雑にする必要はなく、すべてのインターフェース作業はメイン プロジェクトの言語で記述されます。
ただし、C++ バックエンドを自分で作成している場合は、既に提供されている他のオプションのいずれも同様に適用できます。