Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用jna结构类加载DEVMODE而不出错_Java_C++_Jna - Fatal编程技术网

Java 如何使用jna结构类加载DEVMODE而不出错

Java 如何使用jna结构类加载DEVMODE而不出错,java,c++,jna,Java,C++,Jna,我正在尝试用Java加载DEVMODE 按照下面的链接,我创建了一个扩展com.sun.jna.Structure的类SampleClass。 在SampleClass构造函数中,我调用#useMemory(指针m),然后调用#read()。 调用其构造函数后,每个字段都有值。 它看起来很好,但char[]的值看起来很混乱。 所以我想知道加载DEVMODE的正确方法 下面是乱码区 public char[] dmDeviceName = new char[32]; 从现有的指针初始化结构的正

我正在尝试用Java加载DEVMODE

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

下面是乱码区

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

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

public class MyClass extends Structure {
    public char[] buffer = new char[32];
    public MyClass(Pointer p) {
        super(p);
        read();
    }
}
这避免了默认构造函数出现的多余内存分配

请注意,
DEVMODE
有一个union字段,在调用
Structure.read()
之前,您可能应该设置该字段的类型。在这种情况下,如果不这样做,可能不会有什么坏处,因为字段都是原语,但是您可能必须手动调用union字段上的
Structure.read()


结构上调用
toString()
时,可以使用系统属性
-Djna.dump\u memory=true
查看本机内存相对于Java字段的内容。这可以帮助您确定是否缺少字段或填充,或者字段类型大小不正确。

谢谢您的回答,但在我的情况下不起作用。我需要关心字符代码吗?因为我用的是Shift-JIS,什么东西不起作用?请更新您的问题。如果您的母语使用
const char*
请确保使用
byte[]
,如果您的母语使用
const wchar*
请确保使用
char[]
。在前一种情况下,您可能需要手动解码为Java字符串(JNA提供
Native.toString()
帮助)。问题已解决。我引用了错误的指针。谢谢你的帮助!