jna库调用dll动态库

xingyun86 2018-9-8 1899

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的文档没有说明这部分信息的话,则就需要做一些实验来确定要使用的正确的对齐设置。


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回