Ява Юна Учар и Пучар - PullRequest
       19

Ява Юна Учар и Пучар

2 голосов
/ 12 января 2012

Я хочу получить строку Java для ' WlanHostedNetworkSetSecondaryKey ' и ' WlanHostedNetworkSetProperty '. Каждый хочет структуру внутри структуры с CHAR [], а первый хочет PUCHAR. Я пытался использовать String, char [], byte [] и Memory , но они будут продолжать выдавать мне одни и те же ошибки (плохие параметры или плохой профиль для первых). Любой способ, может быть, отладить больше с JNA (вероятно, нет :()? Я также нигде не могу прочитать используемую символьную кодировку, за исключением того, что это не ANSI .. Любая помощь будет отличной!

        * DWORD WINAPI WlanHostedNetworkSetSecondaryKey(
        __in        HANDLE hClientHandle,
        __in        DWORD dwKeyLength,
        __in        PUCHAR pucKeyData,
        __in        BOOL bIsPassPhrase,
        __in        BOOL bPersistent,
        __out_opt   PWLAN_HOSTED_NETWORK_REASON pFailReason,
        __reserved  PVOID pvReserved


     * DWORD WINAPI WlanHostedNetworkSetProperty(
        __in        HANDLE hClientHandle,
        __in        WLAN_HOSTED_NETWORK_OPCODE OpCode,
        __in        DWORD dwDataSize,
        __in        PVOID pvData,
        __out_opt   PWLAN_HOSTED_NETWORK_REASON pFailReason,
        __reserved  PVOID pvReserved
        );

Для большей части документации по этому вопросу

http://msdn.microsoft.com/en-us/library/dd439496(v=VS.85).aspx

http://jna.java.net/javadoc/overview-summary.html#pointers

http://en.wikipedia.org/wiki/Java_Native_Access

Следующий комментарий:

   String buffer = "test";
   ByteBuffer buf = ByteBuffer.allocateDirect(buffer.length()); buf.put(buffer.getBytes()); 
   Pointer pucKeyData = Native.getDirectBufferPointer(buf);

   System.out.println(
           CLibrary.INSTANCE.WlanHostedNetworkSetSecondaryKey(handle.getValue(), 5, pucKeyData, 0, 0, reason, reserved));

1 Ответ

2 голосов
/ 13 января 2012

Я перефразирую то, что я уже прокомментировал (плюс некоторые исправления):

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

...