Tengo un dll que está escrito en C. Tengo que implementar el código que usará este dll en Java, pero no entiendo muy bien el significado del archivo h dado.
typedef void* wqctl_handle; wqctl_handle _stdcall wqctl_connect (const char* SettFile, const char* SettSec, const char* name, const char* pwd); ¿Qué es este tipo de devolución wqctl_handle aplicable a Java y cómo trabajar con él correctamente? (Entiendo que debo usar JNA, pero mi experiencia no es suficiente para entender esto)
Me las arreglé para implementar algo como esto:
public interface Qmonitor extends StdCallLibrary { Qmonitor INSTANCE = (Qmonitor) Native.load(new File("").getAbsolutePath() + "\\ClientAPI.dll", Qmonitor.class); int wqctl_connect(String settFile, String settSec, String name, String pwd); }Según la documentación, este método debería devolver un descriptor de conexión o 0. Pero aparece un error:
java.lang.Error: Invalid memory access at com.sun.jna.Native.invokeInt(Native Method)La documentación de asignaciones de JNA señala que void * se asigna a un Pointer en JNA. El tamaño del puntero depende del bitness del sistema operativo, 32 bits en sistemas de 32 bits y 64 bits en sistemas de 64 bits.
Al incluir un tipo de retorno de int , requiere que el valor de retorno se ajuste a 32 bits. Sin embargo, está ejecutando en un sistema operativo de 64 bits y obtiene el error cuando JNA intenta almacenar 8 bytes en una asignación de memoria de 4 bytes.
Si bien la clase Pointer en sí misma funcionará como un valor de retorno y es un puntero de propósito general de bajo nivel, es una práctica común usar la clase PointerType para punteros con seguridad de tipos. En este caso podrías escribir:
class WqctlHandle extends PointerType {} Luego, podría pasar ese tipo de puntero WqctlHandle seguro a otros métodos según sea necesario. También puede agregar código dentro de esa clase para implementar funciones usando ese puntero como argumento, por ejemplo, incluya un método doFoo() dentro de esa clase que llame a Qmonitor.INSTANCE.doFoo(wcqtl_handle ptr);