JNA参数传递问题,Java数组

JNA参数传递问题,Java数组版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
植兰本⽂主要讲述使⽤JNA模拟结构体并将结构体数组作为参数传递给对应的⽅法。
C语⾔结构体定义如下:
[cpp]
1. typedef struct Rect
2. {
3.    int top;
4.    int bottom;
5.    int left;
6.    int right;
阻尼板7. } RECT;
以和为贵13
JNA模拟该结构体:
需要引⼊:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
[java]
1. //Rect结构体
2. public static class Rect extends Structure {
3.    //Structure⼦类中的公共字段的顺序,必须与C语⾔中的结构的顺序⼀致,否则会报错!
4.    public int top;
5.    public int bottom;
6.    public int left;
迷幻海滩7.    public int right;
8.
9.    public static class ByReference extends Rect implements Structure.ByReference {}
10.    public static class ByValue extends Rect implements Structure.ByValue {}
11.
12.    @Override
13.    protected List getFieldOrder() {
14.        return Arrays.asList(new String[]{"top", "bottom", "left", "right"});
15.    }
16. }
现在要给⽅法传递⼀个结构体数组对象,如何做呢?
C语⾔函数:
[cpp]
1. //rects:结构体数组,len:数组长度
百事可乐猴年广告2. void function(RECT* rects, int len);
JNA模拟如下:
[java]
1. void function(Rect[] rects,int len);
创建数组及调⽤⽅法如下:
[java]
1. int len = 5;
2. //定义数组
3. Rect[] array = (Rect[])new Rect().toArray(len);
4. function(array, len);
注意,这⾥创建数组使⽤了JNA的toArray()⽅法,⽽不是常规创建数组的⽅法,是因为内存空间在java中是不连续的,jna定义数组是需要使⽤toArray⽅法,这样实例化出来的数组内存空间是连续的。
其实这⾥主要是创建结构体数组的地⽅要注意,如果使⽤下⾯的⽅式创建,那就会产⽣⼀个空的数组,申请不到空间:
[java]
奥运会的知识
1. int len = 5;
2. Rect[] array = new Rect[len];
这个代码执⾏后,array=null,也就是创建数组失败了!
原因:内存空间在java中是不连续的,jna定义数组是需要使⽤toArray⽅法,这样实例化出来的数组内存空间是连续的,否则数据第⼀条是正确的,其他是错位的。
blog.csdn/zht666/article/details/38658985  //原⽂地址

本文发布于:2024-09-23 08:22:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361259.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数组   结构   创建
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议