为了账号安全,请及时绑定邮箱和手机立即绑定

JNA:结构体的字符数组成员的计算大小令人惊讶

JNA:结构体的字符数组成员的计算大小令人惊讶

阿波罗的战车 2023-07-19 10:08:10
有人可以向我解释为什么下面的结构大小是 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如果我改用字节数组,它会返回预期值。尽管如此,字符数组的大小还是让我感到惊讶。该字段是否被解释为拥有编码的 String ?因此,我使用各种显式编码(-Djna.encoding="...")启动了这个可执行文件,看看它是否有效果。不用找了...
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

在 中JNA,Java char 可以映射为16-bit32-bit字符。

这意味着您拥有: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 提到的,值得注意的是,C基于映射char应该通过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


查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信