error ejemplos java c++ java-native-interface shared-memory

ejemplos - Memoria compartida entre procesos C++ y Java.



jni java ejemplos (2)

¿Has considerado usar 0MQ Es compatible con Java y C++ y será más confiable. Creo que si quieres hacer memoria compartida en Java tendría que ser a través de JNI, la última vez que miré no había otra forma de hacerlo.

Esto demuestra que tienes que hacerlo a través de JNI si vas por esa ruta. Aunque las soluciones que he encontrado son específicas de Windows, es posible que no se apliquen a usted.

Mi objetivo es pasar datos de un proceso de C ++ a un proceso de Java y luego recibir un resultado.

Lo he logrado a través de una canalización con nombre, pero preferiría compartir los datos en lugar de pasarlos o copiarlos, asumiendo que el acceso sería más rápido.

Inicialmente, pensé en crear un segmento compartido en C ++ que pudiera escribir y leer con Java, pero no estoy seguro de que esto sea posible a través de JNI, y mucho menos seguro.

Creo que es posible en Java asignar la memoria usando ByteBuffer.allocateDirect y luego usar GetDirectBufferAddress para acceder a la dirección en C ++, pero si estoy en lo correcto, esto es para llamadas nativas dentro de JNI y no puedo obtener esta dirección en mi proceso de C ++ ?

Perdido.

Muchas gracias de antemano.


Si tiene memoria compartida, por ejemplo, utilizando CreateFileMapping (Windows) o shmget (Unix), todo lo que necesita es un método nativo en el lado de Java. Luego, puede crear un ByteBuffer que acceda directamente a la memoria compartida utilizando NewDirectByteBuffer como este:

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

Ahora tienes que conseguir un puntero a la memoria compartida. En Windows usarías algo como esto:

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

Ahora puede crear un ByteBuffer respaldado por esta memoria compartida:

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