首页 > 编程知识 正文

JNA内存对齐

时间:2023-05-06 03:37:08 阅读:263429 作者:898

目录

1、Java实现结构体

2、ByteByReference的用法

3、 内存对齐


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);}@Overrideprotected 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入坑之内存对齐

 

遇到难题,多谷歌少百度。

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。