2013-03-14 24 views
15

Il mio obiettivo è passare dati da un processo C++ a un processo Java e quindi ricevere un risultato.Memoria condivisa tra processi C++ e Java

Ho ottenuto questo tramite una named pipe ma preferirei condividere i dati piuttosto che passarli o copiarli, supponendo che l'accesso sarebbe più veloce.

Inizialmente, ho pensato di creare un segmento condiviso in C++ che potessi scrivere e leggere con Java, ma non sono sicuro che ciò sia possibile tramite JNI, figuriamoci sicuro.

Credo sia possibile in Java allocare la memoria utilizzando ByteBuffer.allocateDirect e quindi utilizzare GetDirectBufferAddress per accedere all'indirizzo in C++, ma se sono corretto questo è per le chiamate native all'interno di JNI e non riesco a ottenere questo indirizzo nel mio processo C++?

Perso.

Molte grazie in anticipo.

risposta

4

Avete considerato l'utilizzo di 0MQ supporta sia Java e C++ e sarà più affidabile. Penso che se vuoi fare memoria condivisa in Java dovrebbe essere tramite JNI, l'ultima volta che ho guardato non c'era altro modo per farlo.

Questo mostra che devi farlo tramite JNI se segui questa rotta. Sebbene le soluzioni che ho trovato siano specifiche di Windows che potrebbero non essere applicabili.

13

Se si dispone di memoria condivisa, ad esempio utilizzando CreateFileMapping (Windows) o shmget (Unix), tutto ciò che serve è un metodo nativo sul lato Java. Quindi è possibile creare un ByteBuffer che direttamente accede alla memoria condivisa utilizzando NewDirectByteBuffer come questo:

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

Ora è necessario ottenere un puntatore alla memoria condivisa. Su Windows si può usare qualcosa di simile:

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 

Ora si può semplicemente creare un ByteBuffer che è sostenuta da questa memoria condivisa:

// put it into a ByteBuffer so the java code can use it 
    return env->NewDirectByteBuffer(myBuffer, bufferLength); 
} 
Problemi correlati