2013-03-15 11 views
9

クロスプラットフォームサポートが必要なので、私はJava/JavaFXでプログラムを書いた。私が進歩するにつれ、私はJavaでは不可能な低レベルのOSネットワーキング操作を行う必要がありました。私はRuntime.exec()を使いJNA/JNIに移りましたが、JavaのOSの互換性を維持することは、ネイティブアプリケーションに移植するだけの作業ではなくなってしまうのではないかと心配しています。C/C++でのクロスプラットフォームの互換性(Javaからプロジェクトを移植する)?

これを行うにはどのような方法が最適ですか?

私はGTK +が* nixとwindowsでサポートされていることを知っていますので、私はそれを私のUI用に使用します。 OSごとに異なるバージョンのアプリケーションを保守するのはどれほど難しいでしょうか?クロスプラットフォームである必要がありますが、依然として低レベルのOSアクセスを持っているものを書くための出発点をお勧めしますか?私は多くのJavaの経験があります(そしてOpenGLを使ってC++を使いこなしています)が、以前はLinuxを気にする必要はありませんでした。

また、生のパケットを作成し、ICMPのpingを送信し、Javaから他の低レベルのネットワーキングタスクを実行する良い方法はありますか?

+2

http://www.savarese.com/software/rocksaw/ ?? – Thihara

+0

より具体的にする必要があります。 C++自体は非常に移植性があり、Javaよりもいくつかの点で優れていますが、標準ライブラリは非常に小さいです。 C++では、気づいたようにGUIのようなことをするために、サードパーティやプラットフォーム固有のライブラリに依存する必要があることがよくあります。 – congusbongus

+0

誰かがJava APIがOS APIを呼び出すのが非常に簡単になるようにライブラリを挙げました。私はその名前を覚えていません。 – ZhongYu

答えて

2

あなたの質問はかなり一般的なので、ここでいくつかのベストプラクティスを挙げます。それに応じて質問を編集すれば、私は物事を絞り込むことができます。

最も多くインポートするのは、コンパイラとビルド環境です。これはおそらく選択するのは些細なことです。ClangGCCは、すべての主要なプラットフォームでサポートされています。しかし、ビルド環境はややこしいです。ただ1つのMakefileはすべてのプラットフォームでうまくいかないでしょう。代わりに、CMakeまたはSConsのようなものに行ってください。これにより、ソースを管理し、すべてのシステム上で適切なmakefileを生成しやすくなります。

すべてのプラットフォームで同じGUIを構築したい場合があります。その場合は、上記のようにQtまたはGTK+を使用できます。

ファイルI/O。多くのファイルI/Oをお持ちの場合は、Boost File Systemをご覧ください。

使用するその他のすべてのライブラリについては、すべてのプラットフォームでサポートされていることを確認してください。一般に、私は、歴史的によく維持されているライブラリ、例えばブーストを使うことを勧めます。

最後に、PIMPL Idiomを使用してプラットフォーム固有のコードを非表示にします。

クロスプラットフォームのC++プログラミングの詳細については、Cross-Platform Development in C++: Building Mac OS X, Linux, and Windows Applicationsをご覧ください。

+0

ClangもGCCもWindowsをうまくサポートしていません。 –

3

ネイティブコードの要件はネットワークパケットに関連しているようですので、JPCAPをご覧ください。注:JPCAPには2つのフォークがあります:SourceForge上にホストされているもの(パッケージnet.sourceforge.jpcap.net)、送信をサポートしていないもの、そしてここでリンクしているもの(http://netresearch.ics.uci.edu/kfujiiでホストされていたjpcapパッケージ)私はほとんどの "低レベル"のネットワーク操作(プロミスキャスモードでのリッスン、非IPデータグラムの送信、ICMPなどを含む)で十分であると思います。

+1

Jpcapは非常にintrestingに見えますが、8年間で更新されず、すべてのダウンロードリンクが壊れています。私はFedora reposを使ってソースコードを見つけようとしますが、x86_64ではコンパイルされません。あなたはJpcapを使いますか?多分あなたは私を助けることができます。 – beardedlinuxgeek

+1

興味深い...私は2007年までにダウンロードしたので、リンクが死んでいたことはわかりませんでした。私はgithub上のバージョンへのリンクを使って自分の答えを編集しました。これは送信者のように見えます(githubの 'jpcap/jpcap'はsourceforgeのものと同じです)。 – Javier

0

それが可能であるところはどこでも、クロスプラットフォームのライブラリを使用する

  1. てみデザインのものが多い(例:ブースト)
  2. 書き込みプラットフォーム固有のコードと、その上に良い抽象化レイヤを書きます。

例:Windowsの/シグナリング、Linuxでは/シグナリング、ここで シグナリング、

  • のWindows/をシグナリングする
  • Windowsプラットフォーム固有のシグナリングコードでのLinux /シグナリングは、特定のシグナリングのLinuxプラットフォームですコード
  • シグナルはプラットフォームの抽象化層であり、コンパイル時にプラットフォームを決定できます
1

QtはおそらくクロスプラットフォームのGUIに最適です。 Windows(またはMac)をターゲットにしたい場合、GTK +は素晴らしい選択ではないと思います。しかし、おそらくこれは変更されました。私が最後にチェックして以来、それはありました。また、this postを参照してください。

BoostとPocoはどちらも優れたクロスプラットフォームのC++ライブラリです。彼らはまた、ネットワーキングライブラリ(boost asioとPoco Net)を提供しています。

ICMPのping要求の送信は、boostPocoの両方でサポートされています。

これらのライブラリで独自のイーサネットフレームとIPパケットを構築できるかどうかはわかりません。

関連する問題