JNA参数传递问题,Java数组
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法。
C语言结构体定义如下:
- typedef struct Rect
- {
- int top;
- int bottom;
- int left;
- int right;
- } RECT;
JNA模拟该结构体:
需要引入:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
- //Rect结构体
- public static class Rect extends Structure {
- //Structure子类中的公共字段的顺序,必须与C语言中的结构的顺序一致,否则会报错!
- public int top;
- public int bottom;
- public int left;
- public int right;
- public static class ByReference extends Rect implements Structure.ByReference {}
- public static class ByValue extends Rect implements Structure.ByValue {}
- @Override
- protected List getFieldOrder() {
- return Arrays.asList(new String[]{"top", "bottom", "left", "right"});
- }
- }
现在要给方法传递一个结构体数组对象,如何做呢?
C语言函数:
- //rects:结构体数组,len:数组长度
- void function(RECT* rects, int len);
JNA模拟如下:
- void function(Rect[] rects,int len);
创建数组及调用方法如下:
- int len = 5;
- //定义数组
- Rect[] array = (Rect[])new Rect().toArray(len);
- function(array, len);
注意,这里创建数组使用了JNA的toArray()方法,而不是Java常规创建数组的方法,是因为内存空间在java中是不连续的,jna定义数组是需要使用toArray方法,这样实例化出来的数组内存空间是连续的。
其实这里主要是创建结构体数组的地方要注意,如果使用下面的方式创建,那就会产生一个空的数组,申请不到空间:
- int len = 5;
- Rect[] array = new Rect[len];
这个代码执行后,array=null,也就是创建数组失败了!
原因:内存空间在java中是不连续的,jna定义数组是需要使用toArray方法,这样实例化出来的数组内存空间是连续的,否则数据第一条是正确的,其他是错位的。
JNA参数传递问题,Java数组的更多相关文章
- JNA结构体参数传递,Java数组
JNA以结构体数组为参数进行调用: ////// C++ // student 结构体定义 typedef struct { int age; char name[20]; }Student; // ...
- Java 数组
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...
- Java数组的声明和遍历
Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 n ...
- Java 13 - Java 数组
Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如num ...
- Java 基本语法---Java数组
Java 基本语法---Java数组 0. 概述 数组:相同类型的数据 按照顺序 组成的一种 引用数据类型 . 数据类型:基本数据类型 + 引用数据类型: 引用数据类型:类 + 接口 + 数组 : 一 ...
- Java-Runoob:Java 数组
ylbtech-Java-Runoob:Java 数组 1.返回顶部 1. Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言 ...
- 使用JNA,让java调用原生代码
JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...
- Java学习笔记(5)--- Number类和Math 类,String类的应用,Java数组入门
1.Number 和 Math 类: 在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型(int,double,float这些)的情形. 这种由编译器特别支持的包装称为装箱,所以当内置数 ...
- JavaSE基础(十一)--Java数组
Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 数组特点: 其长度是确定的.数 ...
- Java 数组最佳指南,快收藏让它吃灰
两年前,我甚至写过一篇文章,吐槽数组在 Java 中挺鸡肋的,因为有 List 谁用数组啊,现在想想那时候的自己好幼稚,好可笑.因为我只看到了表面现象,实际上呢,List 的内部仍然是通过数组实现的, ...
随机推荐
- iepngfix.htc让PNG-24在IE6中透明的方法(转)
add:360用的一个方法: <!--[if IE 6]> <script src="http://se.360.cn/js/DD_belatedPNG.js"& ...
- IE6/IE7/IE8 FF常见问题解决
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-04-08) <style type="text/css" > *{ margin:0px a ...
- AspNet上传文件的几个控件
本文转载:http://www.cnblogs.com/downmoon/archive/2009/02/05/1384931.html 1.AspnetUpload 地址:http://www.as ...
- Windows常用性能计数器总结
基础监控: Processor:% Processor Time CPU当前利用率,百分比 Memory:Available MBytes 当前可用内存,兆字节(虚拟内存不需要监控,只有当物理内存不够 ...
- Android监听WIFI网络的变化并且获得当前信号强度
MainActivity如下: package cc.testwifi; import android.os.Bundle; import android.app.Activity; /** * De ...
- j简单的递归
1 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有的信都装错信封共有多少种不同情况. 归纳法例子 1.有n个硬币(n为偶数)正面朝上排成一排,每次将n-1个硬币翻成朝上为止.编程让计算机把 ...
- RAID设备
RAID(Redundant Array of Independent Disk),独立冗余磁盘阵列(通常简称磁盘阵列).磁盘阵列的实质是将多个磁盘通过RAID控制器组合在一起,形成一个新的磁盘.这个 ...
- C#如何读写和创建INI文件
在做项目过程中,有时需要保存一些简单的配置信息,可以使用xml,也可以使用INI文件.下面是C#中读取INI的方法,相信大部分朋友都使用过这种方式.INI文件的存储方式如下, [section] ke ...
- LeetCode44 Wildcard Matching
题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...
- ios 加载本地html css文件 ps:css和html必须在同一文件夹下面
NSString *path = [[NSBundle mainBundle] bundlePath]; NSURL *baseURL = [NSURL fileURLWithPath:path]; ...