如何使用jna Structure类加载DEVMODE而不进行乱码

时间:2015-03-27 10:07:59

标签: java c++ jna

我正在尝试通过Java加载DEVMODE。

如下面的链接,我创建了一个扩展com.sun.jna.Structure的类SampleClass。 在SampleClass构造函数中,我调用#useMemory(Pointer m),然后调用#read()。 在我调用其构造函数后,每个字段都有值。 它看起来不错,但char []的值看起来很混乱。 所以我想知道加载DEVMODE的正确方法。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx

下面是花边场。

public char[] dmDeviceName = new char[32];

1 个答案:

答案 0 :(得分:0)

从现有Structure初始化Pointer的正确方法是使用基于Pointer的构造函数,例如

public class MyClass extends Structure {
    public char[] buffer = new char[32];
    public MyClass(Pointer p) {
        super(p);
        read();
    }
}

这可以避免使用默认构造函数进行多余的内存分配。

请注意DEVMODE有一个union字段,您应该在调用Structure.read()之前设置其类型。在这种情况下,如果你不这样做,它可能会受到伤害,因为这些字段都是原语,但你可能不得不在联合字段上手动调用Structure.read()

当您在-Djna.dump_memory=true上调用toString()时,可以使用系统属性Structure查看与Java字段相关的本机内存内容。这可以帮助您确定是否缺少字段或填充,或者字段类型不正确。