我有一个用Java编写的应用程序和一些带有系统挂钩的本机C ++代码。这两者必须相互沟通。我的意思是C ++子程序必须向Java发送一些数据。如果有可能的话,我会用一种语言写出整件事。我现在正在做的事情真是愚蠢,但有效。我正在隐藏C ++程序的窗口并将其数据发送到它的标准输出,然后我用Java的标准输入读取该输出! 好的,我知道JNI是什么,但我正在寻找更容易的东西(如果有的话)。
任何人都可以告诉我如何做到这一点吗?
任何帮助将不胜感激。
答案 0 :(得分:3)
套接字& Corba是我想到的两种技巧。
答案 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'并像普通文件一样读取内容。