Взаимодействия / коммуникации между C ++ и Java-программой - PullRequest
3 голосов
/ 31 декабря 2010

У меня есть приложение, написанное на Java, и некоторый нативный код C ++ с системными хуками. Эти двое должны общаться друг с другом. Я имею в виду, что подпрограмма C ++ должна отправлять некоторые данные в Java. Я бы написал все это на одном языке, если бы это было возможно для меня. То, что я делаю сейчас, действительно глупо, но работает. Я скрываю окно программы C ++ и отправляю его данные в стандартный вывод, а затем читаю этот вывод со стандартным вводом Java !!! Хорошо, я знаю, что такое JNI, но я ищу что-то более простое для этого (если таковое существует).

Может кто-нибудь дать мне представление о том, как это сделать?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 31 декабря 2010

Сокеты & Корба - это две техники, которые приходят на ум.

Также попробуйте Протоколные буферы Google или Apache Thrift .

2 голосов
/ 31 декабря 2010

Если вы не находите 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 голосов
/ 31 декабря 2010

Два подхода с макушки головы:

1) создать два процесса и использовать любой подходящий IPC;

2) компилировать приложение C ++ в динамическую библиотеку и экспортировать функции со стандартным интерфейсом C, которые должны вызываться из любого языка.

...