gpt4 book ai didi

java - JNA:结构的 char 数组成员的计算大小令人惊讶

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:04 24 4
gpt4 key购买 nike

有人能给我解释一下为什么下面的结构大小是 16 吗?

public class StringStruct extends Structure {
public char[] data = new char[4];

public StringStruct() {}

@Override
protected List<String> getFieldOrder() {
return Collections.singletonList("data");
}
}



public class Main {

public static void main(String[] args) {

StringStruct ss = new StringStruct();

// Prints StringStruct: 16
// I was expecting 4...
System.out.println("StringStruct: " + ss.size());

}

}

我想为拥有他们的数据的结构建模

typedef struct {
char data[4];
} StringStruct_s

如果我改用字节数组,它会返回预期值。尽管如此,char 数组的大小还是让我感到惊讶。该字段是否被解释为拥有编码的 String ?因此,我使用各种显式编码 (-Djna.encoding="...") 启动了这个可执行文件,看看它是否有效果。没有变化...

最佳答案

JNA 中,Java char 可以映射到 16 位32 位 字符。

这意味着你有:32/8 * 4 = 16

https://github.com/java-native-access/jna/blob/master/www/Mappings.md

在你的机器上试试这样的东西

int main() {
printf("%ld\n",sizeof(wchar_t));
}

更新

正如@Daniel 所提到的,值得注意的是基于char 的映射C 应该通过byte 完成。

对于这个类

interface CLibrary extends Library {

public CLibrary.Data.ByVal GetDataValue();
public CLibrary.Data.ByRef GetDataAllocated();

public class Data extends Structure {

public static final List<String> FIELDS = List.of("array");

public static class ByVal extends Data implements Structure.ByValue {}

public static class ByRef extends Data implements Structure.ByReference {}

public byte[] array = new byte[4];

@Override
protected List<String> getFieldOrder() {
return FIELDS;
}
}
}

您将获得预期的大小:4

关于java - JNA:结构的 char 数组成员的计算大小令人惊讶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57843556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com