Java から多くの C++ コードを高速に (開発者の時間を節約して) 使用する方法
-
20-09-2019 - |
質問
背景:私たちは多くのデータ分析を行う物理アプリを設計していますが、私たちの焦点は物理電子機器の統合です。
基本的には電話できるようにしたいです 根 (C++ で書かれた CERN のビッグデータ分析ライブラリです) Java から C++ で書かれたライブラリ。基本的に、Java から ROOT クラスを使用できること (そして、JNI ラッパーのコーディングに多くの時間を費やすことなくそれを実行できること) は、私たちにとって非常に重要な点です (それが難しい場合は、おそらく Qt を使用することになるでしょう)。
次のような方法が考えられます
- JNI - 先ほども言いましたが、私たちはすべてのクラスのラッパーを書きたくありません。。。
- JNA - JNA は C++ マッピングを提供せず、C のみを提供します。
- スイグ ・私は使っていないのですが、使いにくいと聞きました。
関連する可能性のあるその他の事項:ルート ソース コードにアクセスできますが、それを変更したくありません。私たちは結果を移植できるようにしたいと考えています。私たちは無料のライブラリにこだわりたいと考えています。そして、私が言ったように、最初から大騒ぎすることなく、ROOT コードの多くを使用できるようになります。
解決
あらゆる選択肢を使用すると、いくつかのラッピングを行うために必要になるだろう。あなたはすべてのクラスのJNIラッパーを書く必要はありませんが、あなたはより高いレベルのC ++メソッドのグループを包含したクラスを書くことができます。次に、あなただけ(このアプローチだけではなくJNI、あまりにも他の方法のために働く)は、より高いレベルのクラスのラッパーを書く必要があります。
他のヒント
標準入力から、あなたの入力を読み込み、標準出力に出力を書き込み、小さなC ++アプリケーションを作成します。次に、あなたのJavaアプリの中からプロセスを実行し、標準出力からの出力を読み込みます。
これはJNIせずにそれを行うための最善の方法である(そして、行うことは非常に簡単です)。
私がお勧めします Dropbox の djinni インターフェイス生成ツール. 。クロスプラットフォームのモバイル アプリにこれを使用して、Java (Android) および Objective-C (iOS) インターフェイスと C++ データ モデル間のインターフェイスを生成します。
フェイスブックも使ってた アプリの 1 つについて。したがって、かなりよくテストされていると思います。
CppCon での講演をご覧ください 機能の概要については、JNI を使用した Java と C++ 間のインターフェイスは、特にエラーが発生しやすいようです。
ただの思考が、ルートはすでにそれをサポートしていますので、あなたは、Pythonを使用することができますか?あなたも、それは、Javaのコードをラップするのにかかる時間で合理的に習熟することがあります。
JavaのかわりにC#を使用して考えてみましょう。あなたはすでにJavaのに精通している場合、C#2に切り替えることは容易であり、多くを持っていますネイティブコードを呼び出すためのより良いサポートするます。
何、C ++で必要なクラス/関数を記述、コンパイル、およびJavaからそれらの上に()のexecを呼び出すことについてはどうですか?
Java から JNI または同等のコードを介して C または C++ コードを呼び出すと、C/C++ 側のメモリ管理やスレッド セーフの問題により Java プラットフォームが不安定になる危険があります。
JNI などのルートに進む前に、他の選択肢を検討する必要があると思います。
- Java を方程式から外し、完全に C++ (または他の人が提案したように C++ / CC#) で実装します。
- ネイティブ ライブラリを使用して必要なタスクを実行する C++ コマンド ライン アプリケーションを作成し、次のいずれかを使用してアプリケーションを実行します。
java.lang.Runtime.exec
メソッド。 - カスタム プロトコルとして必要な機能を公開するライブラリの「サーバー」ラッパーを C++ で作成し、HTTP、生のソケット、パイプ、または適切なトランスポート レベルを使用してサーバーと通信するように Java 側をコーディングします。
代替案にはすべて欠点がありますが、JNI/JNA などにも欠点があります。最初の段落を参照してください。
編集:システムで JNI/JNA を使用することを決定すると、長期的な影響が生じる可能性があります。安定性の問題に加えて、移植性 (ネイティブ ライブラリは Windows や Linux などで動作するか)、ビルドの問題 (Ant でネイティブ ライブラリをビルドするのは難しいなど)、プラットフォームのバージョンの問題 (Java にアップグレードするかどうか) も考慮する必要があります。 7 何かが壊れますか?)、開発者のスキル (JNI 統合を行った「ジョー」が去りました。Java、C++、JNI を知っている人は他にいますか?)。これらの問題を合計すると、(IMO) 初期開発に必要な時間よりも重要になります。
のそれはおそらく、我々はの
はQtを使用することになり、ハードになる場合なぜあなたはそれに焦点を当てていませんか?これまでのところ、あなたはJavaが優先されなければならない理由の任意の理由を述べていない。
の最大の部分は、おそらくはるかに高速にC ++ですべてのことになるだろう、それを呼び出します。のROOT のソースとコードである場合。
あなたはQtのとOKであるため、UIを心配するあまりすべきではない。
の編集:の
私は本当にJavaでのアプローチに任意の利点を見ることができない - あなたはラッピング層で複雑に追加し、より多くの依存関係を持って、とにかくポートに他のプラットフォームへのソースの大部分を持っている。