C ++和Java进程之间共享存储器(Shared memory between C++ and J

2019-07-21 15:40发布

我的目标是从一个C ++过程数据传递到一个Java过程,然后接收一个结果返回。

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

起初,我以为创造了C ++的共享段,我可以写,并与Java读的,但我不知道这是可能通过JNI,更不用说安全。

我相信这是在Java中可以利用ByteBuffer.allocateDirect分配内存,然后使用GetDirectBufferAddress访问C ++中的地址,但如果我是正确的,这是对JNI内本地调用,我不能在我的C得到这个地址++过程?

丢失。

提前谢谢了。

Answer 1:

如果您有共享内存,例如使用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);
}


Answer 2:

你有没有考虑使用0MQ它同时支持Java的和C ++ ,并会更可靠。 我认为,如果你想要做的共享内存在Java中它必须是通过JNI,我最后一次看有没有其他的方式来做到这一点。

这表明你必须通过做JNI ,如果你走这条路。 虽然我已经找到了解决方案是特定的Windows可能不适用于您。



文章来源: Shared memory between C++ and Java processes