C++和 Java 进程之间的共享内存

我的目标是将数据从C++进程传递到Java进程,然后接收结果。

我已经通过命名管道实现了这一点,但我宁愿共享数据,而不是传递或复制它,假设访问会更快。

最初,我想在C++中创建一个共享段,我可以用Java写入和读取,但我不确定这是否可以通过JNI实现,更不用说安全了。

我相信在Java中可以使用ByteBuffer.allocateDirect分配内存,然后使用GetDirectBufferAddress访问C++中的地址,但是如果我是正确的,这是针对JNI中的本机调用,我无法在我的C++进程中获取此地址?

失去。

提前非常感谢。


答案 1

如果你有共享内存,例如使用CreateFileMapping(Windows)或(Unix),你所需要的只是在Java端有一个本机方法。然后,您可以创建一个字节缓冲器,该字节缓冲器使用NewDirectByteBuffer直接访问共享内存,如下所示:shmget

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);
}

答案 2

您是否考虑过使用0MQ,它支持JavaC++并且会更可靠。我想如果你想在Java中做共享内存,它必须通过JNI,上次我看的时候没有其他方法可以做到这一点。

这表明,如果您走这条路,则必须通过JNI进行操作。尽管我发现的解决方案是Windows特定的,但可能不适用于您。


推荐