java如何为JNA库中的所有结构设置全局内存字节对齐?
有没有办法为JNA库(*.dll Java wrapper)中的所有数据结构设置全局内存字节对齐
有时,我必须在实现过程中通过试错来确定正确的对齐方式,目前我正在以非常笨拙的方式进行这项工作——我在每个结构中设置数据对齐(super(ALIGN_NONE))(在单独的文件中有许多结构)
编辑: 解决我的问题的最好方法是扩展结构:
public abstract class StructureAligned extends Structure {
public static final int STRUCTURE_ALIGNMENT = ALIGN_NONE;
protected StructureAligned() {
super(STRUCTURE_ALIGNMENT);
}
protected StructureAligned(Pointer p) {
super(p, STRUCTURE_ALIGNMENT);
}
}
。。但这引出了下一个问题:哪个(指针)构造函数更好,为什么:
super(p, STRUCTURE_ALIGNMENT);
或者
super(STRUCTURE_ALIGNMENT);
read();
或者
super(STRUCTURE_ALIGNMENT);
useMemory(p);
read();
?
# 1 楼答案
创建自己的
Structure
子类,并使用所需的对齐类型调用相应的构造函数,或者在构造函数中调用setAlignType()
如果JNA没有正确地为平台上最常用的编译器计算适当的默认对齐方式,那么您应该针对JNA提交一个bug
但是,如果您有一个库,它只是出于自身的内部原因使用了一组任意对齐方式,那么通过公共基类关闭所有
Structure
类的对齐方式就更合适了# 2 楼答案
要使其全局应用,请在实例化库时更新本机库选项映射中的默认值