Pregunta

Quiero destinar algo de memoria en C y mantenerla asociada con una instancia de objeto de Java, así:

void configure(JNIEnv *object, jobject obj, ....) {
  char *buf = new char[1024];
  // associated <buf> with <obj> somehow
}

Y luego liberar la memoria cuando el objeto java obtiene el recolector de basura -. Podría hacerlo llamando a una función JNI de la finalize () método del objeto java

La pregunta es, ¿Cómo asocio un puntero C con el objeto de Java? Mantenga un los en el objeto y emitir el puntero a los ? ¿Hay una mejor manera?

¿Fue útil?

Solución

En general, si desea transferir un puntero de C a Java, se recomienda el uso long por lo que hay suficientes bits para mantener el valor del puntero en el caso de la plataforma es de 64 bits.

A continuación, echar un vistazo a ByteBuffer.allocateDirect() que crea una instancia ByteBuffer el que la memoria puede ser compartida con C. puede asignar una ByteBuffer tan directa desde el lado de Java luego pasarlo como un jobject a una función JNI y el interior de esta función JNI que utilice el GetDirectBufferAddress función.

Otra manera es envolver un área natural de memoria con la NewDirectByteBuffer JNI función desde el lado nativo. Se le da una jobject se pasa de nuevo al lado de Java (prestar atención a las referencias locales y globales). prestar atención al hecho de que una vez que el ByteBuffer directa que envuelve la memoria nativa ha sido creado, usted sigue siendo responsable de la gestión de la memoria nativa: en algún momento, tendrá que llamar delete buf; en su código nativo, Java no lo hará para usted.

Otros consejos

Java no tiene ningún concepto de puntero nativa, por lo almacenarla como mucho es la única opción real. Pero usted no debe confiar en finalize para liberar el puntero; el método de finalización no es fiable como un medio de limpieza de los recursos. Ver esta pregunta para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top