3

背景:私たちは多くのデータ分析を行う物理アプリを設計していますが、私たちの焦点は物理的な電子機器を統合することです。

基本的には、JavaのC ++ライブラリで記述されたroot (C ++で記述されたCERNのビッグデータ分析ライブラリ)ライブラリを呼び出せるようにしたいと思います。基本的に、JavaのROOTクラスを使用する機能(およびJNIラッパーのコーディングに多くの時間を費やすことなくそれを実行する機能)は、私たちにとって最高の機能です(難しい場合は、おそらくQtを使用します)。

次の方法が考えられます

  • JNI-私が言ったように-私たちはすべてのクラスのラッパーを書きたくありません。。。
  • JNA -JNAはC++マッピングを提供しませんが、Cのみを提供します。
  • SWIG-使用しませんでしたが、使いにくいと聞きました。

気になるかもしれない他のこと:私たちはルートソースコードにアクセスできますが、それを変更したくありません。結果を移植可能にする必要があります。私たちは無料の図書館に固執したいと思います。そして、私が言ったように、私たちは大騒ぎすることなく、最初からROOTコードの多くを使用することができるでしょう。

4

9 に答える 9

3

どちらを選択しても、ラッピングを行う必要があります。すべてのクラスに対して JNI ラッパーを作成する必要はありませんが、メソッドのグループを包含する高レベルの C++ クラスを作成できます。次に、より高いレベルのクラスのラッパーを作成するだけで済みます (このアプローチは、JNI だけでなく、他のメソッドでも機能します)。

于 2009-10-07T23:41:44.540 に答える
2

Dropbox の djinni インターフェイス生成ツールをお勧めします。クロスプラットフォームのモバイル アプリで Java (Android) と Objective-C (iOS) のインターフェイスと C++ データ モデルの間のインターフェイスを生成するために使用します。

Facebookもアプリの1つにそれを使用しました。ですから、かなりよくテストされていると思います。

その機能の概要については、CppCon での彼らの講演を参照してください。JNI を使用した Java と C++ 間のインターフェースは、特にエラーが発生しやすいようです。

于 2015-08-24T11:08:54.417 に答える
1

JNIEasyは C++ クラスの Java POJO クラスへのマッピングをサポートしていますが、399 ユーロの費用がかかります。無料のライブラリを好むので、CORBA のようなものを使用するソリューションを探すことをお勧めします。これは、C++ クラスを Java クラスにマップする唯一の方法です。

編集: JAS3を検討しましたか?これは root に似た Java ライブラリですか?

于 2009-10-08T04:10:44.307 に答える
0

C ++で必要なクラス/関数を記述し、コンパイルして、Javaからそれらに対してexec()を呼び出すのはどうですか?

于 2009-10-08T00:20:40.330 に答える
0

難しい場合は、おそらくQtを使用します

それに集中してみませんか?これまでのところ、Javaが優先されるべき理由については言及していません。

最大の部分がROOTソースとそれを呼び出すコードである場合、おそらくC++ですべてを実行する方がはるかに高速です。
Qtに問題がないので、UIについてはそれほど心配する必要はありません。

編集:
Javaアプローチの利点は実際にはわかりません。とにかくソースの大部分を他のプラットフォームに移植する必要があり、ラッピングレイヤーが複雑になり、依存関係が増えます。

于 2009-10-08T00:22:03.167 に答える
0

Java から JNI または同等の方法で C または C++ コードを呼び出すと、C/C++ 側のメモリ管理やスレッド セーフの問題により、Java プラットフォームが不安定になるリスクがあります。

JNI などのルートに進む前に、他の選択肢を検討する必要があると思います。

  • Java を方程式から外し、完全に C++ (または他の誰かが提案したように C++ / CC#) で実装します。
  • ネイティブ ライブラリを使用して必要なタスクを実行する C++ コマンド ライン アプリケーションを作成し、いずれかのjava.lang.Runtime.exec方法を使用してアプリケーションを実行します。
  • カスタム プロトコルとして必要な機能を公開するライブラリの「サーバー」ラッパーを C++ で作成し、Java 側をコーディングして、HTTP、生のソケット、パイプ、または適切なトランスポート レベルを使用してサーバーと通信します。

代替手段にはすべて欠点がありますが、JNI / JNA などにも欠点があります。最初の段落を参照してください。

EDIT:システムでJNI / JNAを使用することを決定すると、長期的な結果が生じる可能性があります。安定性の問題に加えて、移植性 (ネイティブ ライブラリは Windows や Linux などで動作するか)、ビルドの問題 (Ant でネイティブ ライブラリをビルドするのは難しいかなど)、プラットフォームのバージョンの問題 (Java にアップグレードするかどうか) を考慮する必要があります。 7 何かを壊しますか?)、開発者のスキル (JNI 統合を行った "Joe" は去りました - 他に Java、C++、および JNI を知っているのは誰ですか?)。これらの問題の合計は、(IMO) 初期開発に必要な時間よりも重要です。

于 2009-10-08T00:14:25.953 に答える
0

考えただけですが、Root はすでに Python をサポートしているので、Python を使用できますか? Java のコードをラップするのにかかる時間については、十分に習熟しているはずです。

于 2009-10-07T23:44:30.120 に答える
0

Java の代わりに C# の使用を検討してください。すでに Java に精通している場合、C# への切り替えは簡単で、ネイティブ コードの呼び出しに対するサポートがはるかに優れています。

于 2009-10-07T23:55:34.863 に答える