2009-12-09 9 views
5

decir que tengo una DLL C++ con un único método exportado tales como:JNA - llamar a los métodos upon ejemplo C++ pasa de nuevo de DLL

CustomerProcessor* getInstance(); 

es decir, que simplemente devuelve una instancia de la clase que contiene realmente los métodos I necesito llamar

Sé que puedo asignar el método getInstance() a una clase en Java utilizando JNA (extensión com.sun.jna.Library), almacenar la instancia devuelta de CustomerProcessor en un com.sun.jna.Pointer.

¿Puedo, de alguna manera, asociar esto a la clase CustomerProcessor para que pueda invocar métodos sobre él (y en caso afirmativo, cómo)?

+0

Según esta pregunta, no puede llamar a los métodos de C++ en JNA: http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code – dfa

Respuesta

2

Para cualquier definición arbitraria type* function() puede asignar el método utilizando JNA como devolver un com.sun.jna.Pointer, pero no podrá invocar métodos en un objeto C++ de JNA.

Una solución simple para esto sería escribir una biblioteca de interfaz de C que simplemente invoca el método en los objetos para usted ... así que si usted tiene alguna función miembro foo() que podría exportar un método C a partir de su código C++:

extern "C" void bar(type* var){ 
    var->foo(); 
} 

Obviamente esto va a añadir un poco de trabajo para usted ... pero sospecho que los gastos generales para el cambio a JNI sería de alrededor de la misma.

+0

De hecho, ya he bajó la ruta de escribir un contenedor de C++, pero me preguntaba si había alguna forma de eliminarlo. Muchas gracias por la aclaración. – William

1

JNAerator (http://code.google.com/p/jnaerator/) puede facilitar la realización de lo que solicite. Tiene algún soporte para demandar y acceso de vtable (requerido para llamar * a este método).

Cuestiones relacionadas