gpt4 book ai didi

java - 如何在JNA中填充结构体数组?

转载 作者:行者123 更新时间:2023-12-01 17:06:52 25 4
gpt4 key购买 nike

我正在尝试在 JNA 中使用以下 Windows API:

UINT WINAPI GetRawInputDeviceList(
_Out_opt_ PRAWINPUTDEVICELIST pRawInputDeviceList,
_Inout_ PUINT puiNumDevices,
_In_ UINT cbSize
);

UINT cbSize 是 RAWPUTDEVICELIST 结构的大小(以字节为单位)。在JNA中如何知道呢?我无意中发现 16 是一个正确的值。

结构如下:

typedef struct tagRAWINPUTDEVICELIST {
HANDLE hDevice;
DWORD dwType;
} RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;

pRawInputDeviceList 是 RAWINPUTDEVICELIST 结构的数组,因此在 JNA 中我声明以下签名:

UINT GetRawInputDeviceList(PointerByReference pRawInputDeviceList, IntByReference puiNumDevices, UINT cbSize);

这是我在 JNA 中的结构:

public static class RawInputDeviceList extends Structure {

public HANDLE hDevice;
public DWORD dwType;

public RawInputDeviceList() {
// required for toArray()
}

public RawInputDeviceList(Pointer pointer) {
super(pointer);
read();
}

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "hDevice", "dwType" });
}

}

当我获取 PointerByReference 值来获取指针时,它为空,这有什么问题?设备数量是正确的,但我无法正确获取 RawInputDeviceList 数组。

这是完整的测试代码:

public class TestRawInput {

public static void main(String[] args) {
PointerByReference lRawInputDevicesReference = new PointerByReference();
IntByReference lNumDevices = new IntByReference();

UINT lRes = WindowsRawInput.INSTANCE.GetRawInputDeviceList(lRawInputDevicesReference, lNumDevices, new UINT(16));

Pointer lRawInputDevicePointer = lRawInputDevicesReference.getValue();
WindowsRawInput.RawInputDeviceList lRawInputDevice = new WindowsRawInput.RawInputDeviceList(lRawInputDevicePointer);
WindowsRawInput.RawInputDeviceList[] lDevices = (WindowsRawInput.RawInputDeviceList[]) lRawInputDevice.toArray(lNumDevices.getValue());

System.out.println("devices deteced=" + lNumDevices.getValue());
for (int i=0;i<lDevices.length;i++) {
System.out.println("device type: " + lDevices[i].dwType);
}
}

public interface WindowsRawInput extends StdCallLibrary {

WindowsRawInput INSTANCE = (WindowsRawInput) Native.loadLibrary("user32", WindowsRawInput.class, W32APIOptions.DEFAULT_OPTIONS);

UINT GetRawInputDeviceList(PointerByReference pRawInputDeviceList,
IntByReference puiNumDevices, UINT cbSize);

public static class RawInputDeviceList extends Structure {

public HANDLE hDevice;
public DWORD dwType;

public RawInputDeviceList() {
// required for toArray()
}

public RawInputDeviceList(Pointer pointer) {
super(pointer);
read();
}

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "hDevice", "dwType" });
}

}
}

}

最佳答案

  1. 使用 Structure.toArray() 创建连续分配结构的数组。
  2. 将该数组的第一个元素传递给您的 native 函数。在这种情况下,struct* 相当于 struct[](原生类型),因此使用 RawInputDeviceList 作为参数类型而不是 通过引用指针。我不确定他们为什么将单个结构称为“列表”,但这就是适合您的窗口。
  3. puiNumDevices 中传递数组的大小, native 函数可能会根据实际填充的计数进行更新。
  4. native 函数将填充内存,JNA 将在函数返回时将 native 内存同步到 Java Structure
  5. cbSize可以通过调用Structure.size()获得。

关于java - 如何在JNA中填充结构体数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25178236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com