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