Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

523
Views
¿Cómo puedo obtener un valor typedef void * en Java?

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)
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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);

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!