有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();

?


共 (2) 个答案

  1. # 1 楼答案

    创建自己的Structure子类,并使用所需的对齐类型调用相应的构造函数,或者在构造函数中调用setAlignType()

    如果JNA没有正确地为平台上最常用的编译器计算适当的默认对齐方式,那么您应该针对JNA提交一个bug

    但是,如果您有一个库,它只是出于自身的内部原因使用了一组任意对齐方式,那么通过公共基类关闭所有Structure类的对齐方式就更合适了

  2. # 2 楼答案

    要使其全局应用,请在实例化库时更新本机库选项映射中的默认值

    public class MyLibrary implements Library {
        static {
            Native.register(MyLibrary.class, NativeLibrary.getInstance("somenativelib"));
            Native.getLibraryOptions(MyLibrary.class).put(Library.OPTION_STRUCTURE_ALIGNMENT, Structure.ALIGN_NONE);
        }
    }