C ++和Java程序之间的交互/通信

时间:2010-12-31 19:22:17

标签: java c++ java-native-interface native interaction

我有一个用Java编写的应用程序和一些带有系统挂钩的本机C ++代码。这两者必须相互沟通。我的意思是C ++子程序必须向Java发送一些数据。如果有可能的话,我会用一种语言写出整件事。我现在正在做的事情真是愚蠢,但有效。我正在隐藏C ++程序的窗口并将其数据发送到它的标准输出,然后我用Java的标准输入读取该输出! 好的,我知道JNI是什么,但我正在寻找更容易的东西(如果有的话)。

任何人都可以告诉我如何做到这一点吗?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

套接字& Corba是我想到的两种技巧。

另外,请尝试Google's Protocol BuffersApache Thrift

答案 1 :(得分:2)

两个方法脱离了我的头脑:

1)创建两个进程并使用任何合适的IPC;

2)将C ++ app编译成动态库并使用标准C接口导出函数,这些应该可以从任何语言调用。

答案 2 :(得分:2)

如果您没有发现JNI'easy',那么您需要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'并像普通文件一样读取内容。