JNA:结构的 char 数组成员的计算大小令人惊讶
JNA: Computed size of char array member of a struct is surprising
有人能给我解释一下为什么下面的结构大小是 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
如果我改用字节数组,它会 returns 预期值。尽管如此,char 数组的大小还是让我感到惊讶。该字段是否被解释为拥有编码的 String ?
所以,我用各种显式编码 (-Djna.encoding="..."
) 启动了这个可执行文件,看看它是否有效果。没有变化...
在 JNA
中,Java 字符可以映射到 16-bit
或 32-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 所提到的,值得注意的是基于 char
的映射 C
应该通过 byte
.
完成
为此class
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
有人能给我解释一下为什么下面的结构大小是 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
如果我改用字节数组,它会 returns 预期值。尽管如此,char 数组的大小还是让我感到惊讶。该字段是否被解释为拥有编码的 String ?
所以,我用各种显式编码 (-Djna.encoding="..."
) 启动了这个可执行文件,看看它是否有效果。没有变化...
在 JNA
中,Java 字符可以映射到 16-bit
或 32-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 所提到的,值得注意的是基于 char
的映射 C
应该通过 byte
.
为此class
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