3

Java で記述されたアプリと、システム フックを備えたネイティブ C++ コードがあります。この 2 つは相互に通信する必要があります。つまり、C++ サブプログラムはデータを Java サブプログラムに送信する必要があります。可能であれば、すべてを1つの言語で書いたでしょう。私が今やっていることは本当にばかげていますが、うまくいきます。C++ プログラムのウィンドウを非表示にして、そのデータを標準出力に送信し、その出力を Java の標準入力で読み取っています!!! わかりました、私はJNIが何であるかを知っていますが、これがより簡単なものを探しています(存在する場合)。

誰でもこれを行う方法について何か考えを教えてもらえますか?

どんな助けでも大歓迎です。

4

3 に答える 3

3

Sockets & Corbaは、頭に浮かぶ 2 つの手法です。

また、Google の Protocol BuffersまたはApache Thriftを試してください。

于 2010-12-31T19:26:03.307 に答える
2

私の頭の上から2つのアプローチ:

1) 2 つのプロセスを作成し、適切な IPC を使用します。

2) C++ アプリを動的ライブラリにコンパイルし、標準 C インターフェイスを使用して関数をエクスポートします。これらは任意の言語から呼び出すことができます。

于 2010-12-31T19:45:25.793 に答える
2

JNI が「簡単」ではない場合は、IPC (プロセス間通信) メカニズムが必要です。したがって、C++ プロセスから Java プロセスと通信できます。

コンソールのリダイレクトで行っていることは、IPC の一種であり、本質的には IPC です。

あなたが送ろうとしているものの性質がはっきりしていないので、良い答えを出すのは非常に難しいです. しかし、単純なプロトコルに簡単にシリアル化できる「単純な」オブジェクトまたは「コマンド」がある場合は、 などの通信プロトコルを使用できますprotocol buffers

#include <iostream>
#include <boost/interprocess/file_mapping.hpp>

// Create an IPC enabled file
const int FileSize = 1000;

std::filebuf fbuf;
fbuf.open("cpp.out", std::ios_base::in | std::ios_base::out 
                          | std::ios_base::trunc | std::ios_base::binary); 
// Set the size
fbuf.pubseekoff(FileSize-1, std::ios_base::beg);
fbuf.sputc(0);

// use boost IPC to use the file as a memory mapped region
namespace ipc = boost::interprocess;
ipc::file_mapping out("cpp.out", ipc::read_write);

// Map the whole file with read-write permissions in this process
ipc::mapped_region region(out, ipc::read_write);

// Get the address of the mapped region
void * addr       = region.get_address();
std::size_t size  = region.get_size();

// Write to the memory 0x01
std::memset(addr, 0x01, size);

out.flush();

これで、Java ファイルは「cpp.out」を開いて、通常のファイルのように内容を読み取ることができます。

于 2010-12-31T20:12:59.890 に答える