【发布时间】:2016-04-20 14:37:48
【问题描述】:
我对基于 C/C++ 结构的 JNA 结构有疑问。字段 nScreenIndex、uVendorID、uProductID、uVersionNumber 看起来不错,但在它们之后我看到奇数字节。我的主要和唯一目标是“提取” pMonitor 字段。 pMonitor 声明和 MONITOR 实现是否正确?
C/C++ 来源:
SCREEN* EloGetScreenByIndex (int nScreenIndex);
typedef struct SCREEN_TAG
{
int nScreenIndex;
USHORT uVendorID;
USHORT uProductID;
USHORT uVersionNumber;
wchar_t szDevicePath [MAX_PATH];
HANDLE hCalTouchThread;
MONITOR* pMonitor;
LPVOID pCWndBeamHandler;
BOOL bIrBeams;
} SCREEN;
typedef struct MONITORS_TAG
{
int elo_mon_num;
int x;
int y;
int width;
int height;
DWORD orientation;
bool is_primary;
} MONITOR;
和 Java/JNA 代码:
SCREEN EloGetScreenByIndex(int nScreenIndex);
public class SCREEN extends Structure {
public int nScreenIndex;
public short uVendorID;
public short uProductID;
public short uVersionNumber;
public char[] szDevicePath = new char[WinDef.MAX_PATH];
public WinNT.HANDLE hCalTouchThread;
public MONITOR pMonitor;
public PointerByReference pCWndBeamHandler;
public boolean bIrBeams;
...
}
public class MONITOR extends Structure {
public int elo_mon_num;
public int x;
public int y;
public int width;
public int height;
public int orientation;
public byte is_primary;
public MONITOR() {
super();
}
@Override
protected List<? > getFieldOrder() {
return Arrays.asList("elo_mon_num", "x", "y", "width", "height", "orientation", "is_primary");
}
public MONITOR(Pointer peer) {
super(peer);
}
public static class ByReference extends MONITOR implements Structure.ByReference {
};
public static class ByValue extends MONITOR implements Structure.ByValue {
};
}
【问题讨论】:
-
pCWndBeamHandler应该是Pointer,而不是PointerByReference。您还应该为每个Structure添加一个基于Pointer的构造函数,该构造函数在super()之后调用Structure.read()(不是关键,但可以避免不必要的额外内存分配)。
标签: java c struct structure jna