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

3
我有一个用Java编写的应用程序和一些具有系统钩子的本机C++代码。这两个必须相互通信,也就是说,C++子程序必须向Java子程序发送一些数据。如果可能的话,我会将整个程序都写在一个语言中。但现在我做的事情真的很傻,但它可以工作。我隐藏了C++程序的窗口,并将其数据发送到标准输出,然后使用Java的标准输入读取该输出!!! 好的,我知道JNI是什么,但我正在寻找更简单的方法(如果有的话)。
有人能给我任何关于如何做到这一点的想法吗?
任何帮助都将不胜感激。

你有修改这两个程序的能力吗?还是其中一个是固定的? - templatetypedef
@templatetypedef,是的,我可以编辑两个。它们都是我的。你可以在这里查看应用程序(mimer.sourceforge.net)。它已经更新到2.0版本了! - Auxiliary
3个回答

3

2
如果您认为JNI不是“易于使用”的,则需要一种IPC(进程间通信)机制。因此,从您的C ++进程中,您可以与Java进程通信。
您所做的控制台重定向是IPC的一种形式,在本质上就是IPC。
由于您发送的内容的性质并不十分清楚,因此很难给出一个好的答案。但是,如果您有“简单”的对象或“命令”,可以很容易地序列化为简单协议,那么您可以使用通信协议,如协议缓冲区
#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接口的函数,这些函数可从任何语言调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接