Java JNA UCHAR和PUCHAR

我希望得到一个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)); 

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

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

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

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

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

要将初始化的无符号字节数组分配给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; 

如果从JNAexception中获取错误参数,则表示JNA方法的一个或多个参数使用了不正确的数据类型。

JNA提供了一些类似DWORD WinDef类类型。 但是不包括像PUCHAR这样的一些WinDef类型。 但是,要将整数值分配给DWORD类型并将其检索回来,您需要这样做:

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

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