Java JNA UCHAR和PUCHAR

时间:2012-01-12 14:04:19

标签: java c winapi jna

我希望获得一个Java字符串' WlanHostedNetworkSetSecondaryKey '和' WlanHostedNetworkSetProperty '。一个人想要一个带有CHAR []的结构中的结构,而第一个需要一个PUCHAR。我尝试使用 String,char [],byte []和Memory ,但是它们会继续产生相同的错误(错误的参数或错误的配置文件,第一个)。任何方式可能用JNA调试更多(可能不是:()? 我也无法读取所使用的characterencoding,除了它不是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 个答案:

答案 0 :(得分:2)

我正在改述我到目前为止所评论的内容(加上一些更正):

UCHAR被定义为C u_byte unsigned byte。但是,在Java中,我们没有unsigned byte类型,只有byte类型的有符号字节。不要担心,为了在Java中获得unsigned byte,我们使用这个技巧:((int)mybyte & 0xFF)

PUCHAR被定义为C宏POINTER(u_byte),它是一个C指针,unsigned byte *指向无符号字节数组。原因是有一个动态数组。

但是,如果你在JNA byte[]中使用char[]Structure,JNA会抱怨Array fields must be initialized 未初始化 byte[]char[]字段。在您的情况下,它失败了使用dwKeyLength字段来定义动态无符号字节数组pucKeyData的大小的目的。

pucKeyData的正确JNA类型为Pointer。但是,您需要找到一种方法,根据 WlanHostedNetworkSetSecondaryKey 结构中Pointer长度给出的大小,为pucKeyData字段的dwKeyLength字段分配数组。

要将初始化的无符号字节数组分配给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提供了一些类似DWORD的WinDef类类型。但是不包括像PUCHAR这样的一些WinDef类型。但是,要将整数值分配给DWORD类型并将其检索回来,您需要这样做:

DWORD dwKeyLength = new DWORD(5);
System.out.println("dwKeyLength integer value: " + dwKeyLength.intValue());

注意:这篇文章基于JNA平台版本3.3.0