我有一个结构,它没有完全像原始的C一样描述。
public class DISPLAY_DEVICE extends Structure {
public char DeviceName[] = new char[32];
public int StateFlags;
}
实际上,它需要更多变量。但是我需要很长时间才能将它们全部移植。 现在我创建结构并将指针传递给dll函数,并尝试使用device.read();重新获得变量。但是,变量返回空。所以我的问题是,我是否需要填写整个结构?或者还有其他错误吗?
DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
int i = 0;
while((CLibrary.INSTANCE.EnumDisplayDevicesA(Pointer.NULL, i, displayDevice.getPointer(), 0))) {
System.out.println("screen" + i);
displayDevice.read();
System.out.println(displayDevice.StateFlags);
System.out.println(displayDevice.DeviceName);
答案 0 :(得分:4)
至少,您必须将结构定义为与其本机对应的大小相同(您可以使用byte []字段填充它,以获取您不关心的内容。)
例如:
public class MyStruct extends Structure {
public char[] DeviceName = new char[32];
public char StateFlags;
public byte[] dontcare = new char[128];
}
如果JNA的platform.jar中没有该定义,您还可以使用JNAerator从C头自动生成映射。