2013-03-14 3 views
15

Моя цель - передать данные из процесса C++ в процесс Java, а затем получить результат обратно.Общая память между процессами на C++ и Java

Я достиг этого через именованный канал, но я предпочел бы использовать данные, а не передавать или копировать их, предполагая, что доступ будет быстрее.

Первоначально я думал о создании общего сегмента на C++, который мог писать и читать с помощью Java, но я не уверен, что это возможно через JNI, не говоря уже о безопасности.

Я полагаю, что в Java можно выделить память с помощью ByteBuffer.allocateDirect, а затем использовать GetDirectBufferAddress для доступа к адресу на C++, но если я прав, это для внутренних вызовов внутри JNI, и я не могу получить этот адрес в моем C++-процессе?

Lost.

Большое спасибо заранее.

ответ

4

Вы считаете, что используете 0MQ, он поддерживает как Java, так и C++ и будет более надежным. Я думаю, что если вы хотите делать общую память в Java, это должно быть через JNI, в прошлый раз, когда я смотрел, не было другого способа сделать это.

Это показывает, что вы должны сделать это через JNI, если вы идете по этому маршруту. Хотя решения, которые я нашел, являются специфичными для Windows, которые могут не применяться к вам.

13

Если у вас есть разделяемая память, например, с использованием CreateFileMapping (Windows) или shmget (Unix), все, что вам нужно, - это родной метод на стороне Java. Тогда вы можете создать ByteBuffer что непосредственно доступ к общей памяти, используя NewDirectByteBuffer так:

JNIEXPORT jobject JNICALL Java_getSharedBuffer(JNIEnv* env, jobject caller) { 
    void* myBuffer; 
    int bufferLength; 

Теперь вы должны получить указатель на общую память. В Windows вы должны использовать что-то вроде этого:

bufferLength = 1024; // assuming your buffer is 1024 bytes big 
    HANDLE mem = OpenFileMapping(FILE_MAP_READ, // assuming you only want to read 
      false, "MyBuffer"); // assuming your file mapping is called "MyBuffer" 
    myBuffer = MapViewOfFile(mem, FILE_MAP_READ, 0, 0, 0); 
    // don't forget to do UnmapViewOfFile when you're finished 

Теперь вы можете просто создать ByteBuffer, подкрепленная этой общей памяти:

// put it into a ByteBuffer so the java code can use it 
    return env->NewDirectByteBuffer(myBuffer, bufferLength); 
} 
Смежные вопросы