2013-03-14 92 views
15

我的目標是將數據從C++進程傳遞到Java進程,然後再接收結果。C++和Java進程之間的共享內存

我已經通過命名管道,實現了這一點,但我更願意共享數據,而不是傳遞或複製它,假設訪問速度會更快。

起初,我以爲創造了C++的共享段,我可以寫,並與Java讀的,但我不知道這是可能通過JNI,更不用說安全。

我相信在Java中可以使用ByteBuffer.allocateDirect分配內存,然後使用GetDirectBufferAddress訪問C++中的地址,但如果我正確的話,這是JNI中的本地調用,我無法獲得此地址在我的C++過程?

丟失。

非常感謝提前。

回答

4

您是否考慮過使用0MQ它支持JavaC++,並且會更可靠。我想如果你想在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); 
}