2011-06-15 12 views
5

Actualmente estoy escribiendo un contenedor JNI para una clase de C++ y no estoy seguro de si lo que he hecho hasta ahora es la forma más correcta.C++ Java wrapper construction con JNI

lo que tengo entendido, no es posible declarar un constructor de Java native, por lo que terminó de escribir algo como:

package log; 

public class Logger 
{ 
    private long internalPtr = 0; 

    private native long createNativeInstance(String application, String module, String function); 

    public Logger(String application, String module, String function) 
    { 
     this.internalPtr = createNativeInstance(application, module, function); 
    } 

    public native String getApplication(); 

    static { System.loadLibrary("log_java"); } 
} 

Básicamente, mi campo internalPtr mantiene el puntero a mi subyacente C++ instancia y yo créelo en un constructor de Java puro, utilizando el método static nativecreateNativeInstance().

¿Es esta la manera correcta de hacer las cosas?

Otra pregunta que podría obtener una respuesta es: "¿Cómo debo manejar la desasignación?"

Mis habilidades de Java son extremadamente limitadas, así que no dude en sugerir incluso las soluciones más "obvias".

Muchas gracias.

+1

Comprobar JNA, podría ser más fácil para empezar. – lexicore

Respuesta

2

Esa es la forma en que siempre he implementado clases nativas que envuelven alrededor de un objeto C/C++. Creo que escribir un constructor nativo podría ser un poco doloroso, así que nunca lo intenté.

Para la desasignación, usted hace algo similar. Escriba una función C/C++ que desasigne la memoria para su objeto C/C++, y luego invoque esto desde el destructor java (método de finalización). Así que algo como esto:

private native void destroyNativeInstance(long p_internalPtr); 

public void finalize() 
{ 
    destroyNativeInstance(this.internalPtr); 
} 
+0

Parece una solución elegante. Gracias ! – ereOn