2012-01-13 211 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