verificar - ¿cómo activar el plugin de java en google chrome?




Forzar Java para llamar a mi destructor de C++(JNI) (4)

Pensé que esta pregunta se habría hecho antes, pero no pude encontrarla aquí ...

He usado SWIG para crear un contenedor JNI en torno a una clase C ++. Todo funciona bien, excepto que Java nunca parece llamar al finalize () de la clase, por lo que, a su vez, nunca se llama al destructor de mi clase. El destructor de la clase hace algo de E / S de archivo final, así que desafortunadamente, esto no es solo una fuga de memoria menor.

Buscando a través de Google, no parece haber una forma de forzar a Java a GC y destruir un objeto. ¿Cierto?

Sé que podría manipular mi archivo SWIG y crear una función java que llamaría al destructor C ++, pero esta clase es utilizada por los usuarios finales en varias plataformas / idiomas diferentes, por lo que la adición de un solo Java creará una inconsistencia que nuestra tecnología a los escritores no les va a gustar.


Cuestiones como esta son la razón por la que C # eligió el patrón IDisposable para la finalización determinista.

Sugiero que siga el mismo patrón y lo adapte para sus usuarios de Java.

En su clase de c ++, cree un método público separado que disponga de sus recursos. Llámalo cerca, o deséchalo, o algo así.

Haga que su destructor de C ++ llame al método público y diga a los usuarios de GC / gestión de la clase C ++ que deben llamar al método para evitar pérdidas de memoria.


Los finalizadores Java son en su mayoría inútiles, en mi opinión, y ciertamente no son un reemplazo para los destructores C ++. Desafortunadamente, Java no tiene reemplazo para C ++ RAII.

No se moleste en tratar de forzar la finalización de Java. Cuando hayas terminado con lo que sea, toda una función que se deshará de él. Eso es todo lo que puedes hacer.


Después de mirar un poco más el código producido por SWIG, veo que las personas SWIG ya se han ocupado de esto, agregan una función delete () para usted. Parece bastante bien cuidado de la posibilidad de que tanto el programador como el GC eliminen el objeto también.


No puede forzar GC con System.gc (). Además, no está garantizado que alguna vez se ejecute un GC, por ejemplo, si su aplicación se ejecuta solo por un tiempo corto y luego su finalizador no se ejecutará en absoluto (la JVM no lo ejecutará al salir). Debes crear un close () o destroy () o cualquier función para tu clase y cuando termines de usar una instancia de esta clase llámala, preferiblemente de un bloque finally, como.


MyClass x = null;
try{
    x = new MyClass();
    x.work();
} finally {
    if (x!=null)
        x.close();
}




jni