Я перефразирую то, что я уже прокомментировал (плюс некоторые исправления):
UCHAR
определяется как макрос C u_byte
, который является unsigned byte
. Но в Java у нас нет типа unsigned byte
, только байт со знаком типа byte
. Не волнуйтесь, чтобы получить unsigned byte
в Java, мы используем этот трюк: ((int)mybyte & 0xFF)
PUCHAR
определяется как макрос C POINTER(u_byte)
, который является указателем C, unsigned byte *
, который указывает на массив байтов без знака. Причина в том, чтобы иметь динамический массив.
Но, если вы используете byte[]
или char[]
в JNA Structure
, JNA будет жаловаться, Array fields must be initialized
для неинициализированного byte[]
или char[]
поля. В вашем случае это отрицает цель наличия поля dwKeyLength
для определения размера динамического байтового массива без знака pucKeyData
.
Правильный тип JNA для pucKeyData
- Pointer
. Но вам нужно найти способ назначить массив этому полю Pointer
для поля pucKeyData
на основе размера, заданного длиной dwKeyLength
в структуре WlanHostedNetworkSetSecondaryKey .
Чтобы присвоить инициализированный массив без знака байту Pointer
, нам нужно использовать прямой ByteBuffer
. Не забудьте освободить этот прямой буфер вручную после использования, так как он больше не управляется Java GC ...
String buffer = "1234567890";
DWORD dwKeyLength = new DWORD(buffer.length());
ByteBuffer buf = ByteBuffer.allocateDirect(dwKeyLength.intValue());
buf.put(buffer.getBytes());
Pointer pucKeyData = Native.getDirectBufferPointer(buf);
System.out.println("pucKeyData data:" + pucKeyData.getString(0));
buf = null;
pucKeyData = null;
Если вы получаете неверные параметры из исключения JNA, это означает, что один или несколько параметров вашего метода JNA используют неправильные типы данных.
JNA предоставляет несколько типов классов WinDef, таких как DWORD
. Но некоторые типы WinDef, такие как PUCHAR
, не включены. Но, чтобы присвоить целочисленное значение типу DWORD
и получить его обратно, вам нужно сделать так:
DWORD dwKeyLength = new DWORD(5);
System.out.println("dwKeyLength integer value: " + dwKeyLength.intValue());
Примечание: этот пост основан на платформе JNA версии 3.3.0