我正在寻找一个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));
最佳答案
我正在改写我迄今为止的评论(加上一些更正):UCHAR
定义为C宏u_byte
,它是一个unsigned byte
但是,在Java中,我们没有unsigned byte
类型,只有byte
类型的有符号字节别担心,要在Java中获得unsigned byte
,我们使用以下技巧:((int)mybyte & 0xFF)
PUCHAR
定义为C宏POINTER(u_byte)
它是一个C指针,unsigned byte *
指向一个无符号字节数组原因是要有一个动态数组。
但是,如果在JNAbyte[]
中使用char[]
或Structure
,JNA将抱怨,Array fields must be initialized
表示未初始化的byte[]
或char[]
字段在您的例子中,它无法使用dwKeyLength
字段定义动态无符号字节数组pucKeyData
的大小。pucKeyData
的正确JNA类型是Pointer
但是,您需要找到一种方法,根据WlanHostedNetworkSetSecondaryKey结构中Pointer
长度给定的大小,为pucKeyData
字段的dwKeyLength
字段分配数组。
要将初始化的无符号字节数组赋给Pointer
,我们需要使用directByteBuffer
记住在使用后手动释放这个直接缓冲区,因为它不再由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版
关于java - Java JNA UCHAR和PUCHAR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8836342/