目录
1、Java实现结构体
动态库结构体定义和Java实现的结构体定义:
typedef _vlp_info
{
int vlp;
char vlp[20];
int vlp;
unsigned char vlp[2];
unsigned char vlp[16];
unsigned int vlp;
unsigned int i[3];
unsigned char* image[3];
} T_VLP;
public static class V_InitInfos extends Structure{
public int vlp;
public byte[] vlp = new byte[20];
public int vlp;
public byte[] vlp = new byte[2];
public byte[] vlp = new byte[16];
public int vlp;
public int[] i = new int[3];
public ByteByReference[] image = new ByteByReference[3];
public static class ByReference extends V_InitInfos implements Structure.ByReference{
}
public static class ByValue extends V_InitInfos implements Structure.ByValue{
}
//内存一字对齐
public VLPR_InitInfos(){
super(ALIGN_NONE);
}
@Override
protected List getFieldOrder() {
List<String> Field = new ArrayList<String>();
Field.add("image");
...
return Field;
}
}
此次遇到的问题有一个前提,动态库是cdecl调用。
2、ByteByReference的用法
动态库结构体定义中最后一个image是char*[] 刚开始不知道java里面用什么来代替,后来谷歌到可以用ByteByReference[](https://code.google.com/archive/p/jnaerator/wikis/CToJavaTransformation.wiki),百度没搜到。
其他的对应类型,可以直接百度搜索,不断尝试。对于unsigned类型,本次没有处理,直接在java中使用对应数据类型。
3、 内存对齐
一开始出现的问题是,数据到倒数第三个就取不到正确的数据,后来查到是内存对齐的问题。
JNA提供了四种内存对齐的方式,分别是:ALIGN_DEFAULT、ALIGN_NONE、ALIGN_GNUC和ALIGN_MSVC。
具体应用请看文章JNA入坑之内存对齐
遇到难题,多谷歌少百度。