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