java jna: obtenga una matriz de bytes por referencia java.lang.IndexOutOfBoundsException

Estoy usando JNA y aparece un error extraño al obtener una matriz de bytes.

Yo uso este código:

PointerByReference mac=new PointerByReference();
NativeInterface.getMac(mac);
mac.getPointer().getByteArray(0,8)

Y arroja una excepción IndexOutOfBoundsException: los límites exceden el espacio disponible: tamaño = 4, desplazamiento = 8 también si estoy seguro de que el byte devuelto tiene una longitud de 8 bytes. Traté de obtener esa matriz como String:

mac.getPointer().getString(0)

Y aquí obtengo con éxito una cadena de 8 caracteres de longitud. ¿Puedes entender por qué?

Gracias por su atención.

preguntado el 22 de mayo de 12 a las 10:05

1 Respuestas

PointerByReference.getValue() devuelve el Pointer estas buscando. PointerByReference.getPointer() devuelve su dirección.

mac.getPointer().getByteArray(0, 8) está intentando leer 8 bytes del PointerByReference memoria asignada (que es un puntero) y coloque esos bytes en una matriz primitiva de Java. Está solicitando 8 bytes pero solo hay 4 asignados, por lo tanto, el error correspondiente.

mac.getPointer().getString(0) está intentando leer una cadena C de la memoria asignada para un valor de puntero (como si fuera const char *, y convertir esa cadena C en Java String. Solo verifica el inicio de la cadena en el lado de Java, por lo que seguirá leyendo la memoria (incluso si técnicamente está fuera de los límites) hasta que encuentre un valor cero.

EDITAR

mac.getValue().getByteArray(0, 8) le dará lo que originalmente estaba tratando de obtener (una matriz de 8 bytes).

EDITAR

Si se supone que su función llamada está escribiendo en un búfer (y no escribiendo la dirección de un búfer), entonces debe cambiar su firma para aceptar byte[] en cambio, por ejemplo

byte[] buffer = new byte[8];
getMac(buffer);

contestado el 23 de mayo de 12 a las 12:05

Ok, pero ¿cómo leer los valores de bytearray y no el puntero? - Tobia

Usando getValue() mi jvm entra en el error ACCESS_VIOLATION y falla... :-( No puedo entender por qué con getString(0) funciona... - Tobia

Tómese un momento y lea cómo funcionan los punteros. Si no entiendes eso, solo estarás adivinando. - tecnicismo

Apuesto a que tu código nativo no hace lo que estás insinuando que hace. ¿Cuál es la declaración real? ¿El código nativo escribe un puntero a la dirección proporcionada o escribe datos en la dirección proporcionada? - tecnicismo

Su última edición resolvió mi problema... fue tan simple, pero no lo intenté porque pensé en usar algún objeto ByReference. Gracias. - Tobia

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.