2010-12-31 15 views
3

Javaで書かれたアプリとシステムフックを持つネイティブC++コードがあります。これら2つは互いに通信しなければならない。つまり、C++の副プログラムはJavaにデータを送る必要があります。それが可能ならば、私はすべてのことを一つの言語で書いていたでしょう。私が今やっていることは本当に愚かですが、うまくいきます。私はC++プログラムのウィンドウを隠し、そのデータを標準出力に送信してから、その出力をJavaの標準入力で読み取っています! [OK]を、私はJNIが何であるか知っていますが、私はこれのために何かを探しています(存在する場合)。C++とJavaプログラム間の相互作用/コミュニケーション

誰でも私にこのことをどうやって伝えることができますか?

ご協力いただきますようお願い申し上げます。

+0

両方のプログラムを変更できますか?またはそれらの1つは修正されていますか? – templatetypedef

+0

@templatetypedef、Yeh私は両方を編集することができました。彼らはどちらも私のものです。あなたはここでアプリを見ることができます(mimer.sourceforge.net)バージョン2.0です! – Auxiliary

答えて

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」を開き、通常のファイルのように内容を読み取ることができます。

2

二つのアプローチ:

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

2)C++アプリケーションをダイナミックライブラリにコンパイルし、標準のCインタフェースを使用して関数をエクスポートします。これらの関数は任意の言語から呼び出し可能です。

関連する問題