0

ここでの私の目標は、2 つの別個のアプリケーション (1 つは Java で、もう 1 つは C++ で、どちらも同じマシン上にあります) を同じ SQLite データベースから読み取るようにすることです。C++ の実装は既に機能しており、その通信に必要なすべてのメソッドが含まれています。sqlite3.h ライブラリを使用します。

最初に行う合理的な方法は、Java アプリケーションで JDBC または SQLite ラッパーを使用することです。問題は、組み込みシステム (POSIX) のリソースが非常に限られており、必要な *.jar を組み込んだ場合、単純なクエリの実行に非常に時間がかかることです。Xerial JDBC、sqlite4java、sqljet、および Christian Werner の Javasqlite Wrapper/JDBC ドライバーを試しました。JavaVM は、すべてをロードして実行するのに時間がかかりすぎて、パフォーマンスが重大な問題になります。

回避策として、Java アプリケーションを管理して、システム コマンドを使用し、sqlite3 コマンド シェルを実行してクエリを実行し、回答を取得しました。より「スタイリッシュ」で安全なソリューションを探しています。

C++ のメソッドを使用するには、実際には Java アプリケーションが必要です。メソッドは 1 つの値のみを返すように実装されているため、文字列を返すだけです。多くの IPC を読んだ後、名前付きパイプを使用する必要があるという結論に達しました。問題は、JNI を使用する必要があるということですが、私は初心者の Java レベルを持っており、この頃には JNI は私には複雑すぎます。この場合、JNIはやり過ぎですか?

ここで実装できる他のソリューションは何ですか?

4

3 に答える 3

2

IPC で必要なパフォーマンスについてはわかりませんが、いくつかのアプローチがあります。

  1. ソケットを使用する
  2. パイプを使う
  3. memorymappedfiles を使用します (memorymappedfiles を使用すると、パフォーマンスが向上します)

どちらの場合でも、Java から C++ に、またはその逆に渡すオブジェクト (データ) のシリアライザー/デシリアライザーが必要になります。

データ形式によっては、Java 側でのみシリアライザー/デシリアライザーが必要になる場合があります。(たとえば、C++ がデコードする必要なく読み取るバイナリ データを送信します)。Javaでメモリマップされたファイルを使用する方法に関する優れたチュートリアルはこちらで見つけることができ、C ++ではmmap関数を使用する必要があります。

于 2013-09-06T08:34:58.893 に答える
0

実際、私は間違っていました。Java で名前付きパイプを使用するために JNI を使用する必要はありません。基本的なテクニックを使って、これら 2 つのプロセスをうまく伝えました。Java では、FileOutputStream と FileInputStream を使用して名前付きパイプと通信しました。

このリンクは私にとって特に役に立ちました:

http://carminedimascio.com/2014/01/named-pipes-with-java/

于 2013-09-12T09:37:50.317 に答える
0

swigを使用できます。Swig は C/C++ ヘッダーを解析し、その Java クラス/関数を生成できます。生成されたコードには、c++ クラスまたは c 関数を呼び出すための jni 呼び出しが含まれています。

于 2013-09-06T08:45:01.860 に答える