我有一个结构,它不像原来的 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);
最佳答案
至少,您必须将结构定义为与其原生对应物相同的大小(对于您不关心的内容,您可以使用 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 header 自动生成映射。
关于java - 来自指针的 JNA Java 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857423/