http://www.java2s.com/Code/JarDownload/jna/
https://www.eshayne.com/jnaex/index.html
一些本地库有着不同的内存对齐风格(因为编译器和编译器选项存在差异的缘故),因此,既然JNA通常在不选择重新编译本地代码的情况下使用,故它可以方便地设置使用的对齐策略。
可以通过调用Structure.setAlignType(int alignType)来设置扩展了Structure的Java类的成员的对齐策略,对齐方式有四种选项,如下表中的描述。
对齐规范 | JNA描述 |
ALIGN_DEFAULT | 使用平台缺省的对齐 |
ALIGN_GNUC | 对32位的x86 linux/gcc有效,对齐字段大小,最大为4个字节 |
ALIGN_MSVC | 对w32/msvc有效,根据字段大小来对齐 |
ALIGN_NONE | 不对齐,所有字段都用1个字节的最小分界线 |
前面展示的dump()输出表明,TWAIN的本地代码使用了没有特别对齐的策略(前面表中的ALIGN_NONE),不过既然这也不是JNA的缺省设定,那么所有代替C结构的Java类都有一个缺省的构造方法,该方法把对齐方式设置为ALIGN_NONE(参见Win32Twain.java)。下面的代码是结构TW_INDENTITY的带有缺省构造方法的Java类的简略形式。
public class TW_IDENTITY extends Structure { public TW_IDENTITY() { setAlignType(Structure.ALIGN_NONE); } public int Id; public TW_VERSION Version = new TW_VERSION(); public short ProtocolMajor; public short ProtocolMinor; . . . } |
一般来说是无法知道任何具体的本地库所使用的对齐策略的,因此,如果DLL的文档没有说明这部分信息的话,则就需要做一些实验来确定要使用的正确的对齐设置。