2012-01-13 203 views
0

我有一个结构体,它不像原始的C一样被完全描述。JNA来自指针的Java结构体

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

如果你想从你的C/C++定义中生成Java访问器代码,这可能是一个需要考虑的工具:https://github.com/marc-christian-schulze/structs4java – 2016-09-10 10:22:24

回答

4

至少,你必须定义结构尺寸均与其天然对应相同的(你可以与你的东西不关心一个byte []字段垫吧)。

例如:

public class MyStruct extends Structure { 
    public char[] DeviceName = new char[32]; 
    public char StateFlags; 
    public byte[] dontcare = new char[128]; 
} 

您还可以使用JNAerator自动生成从C头映射如果定义不提供JNA的platform.jar。

+0

我试过JNAerator,但它没有与内部结构和工会合作良好。 – RobotRock 2012-01-16 14:49:17

+1

我建议找到本地结构的整体大小,然后只定义那些你感兴趣的字段。 – technomage 2012-01-18 01:55:19