JNA结构体参数传递,Java数组

时间:2022-05-25 16:52:47

JNA以结构体数组为参数进行调用:

  1. ////// C++
  2. // student 结构体定义
  3. typedef struct
  4. {
  5. int age;
  6. char name[20];
  7. }Student;
  8. // 修改java对象的属性值
  9. JNAAPI bool changeObjs(Student stu[],int size)
  10. {
  11. for(int i=0;i<size;i++)
  12. {
  13. stu[i].age*=10;
  14. strcpy(stu[i].name,"wokettas");
  15. }
  16. return true;
  17. }
  18. /////// Java
  19. // JNA调用方法
  20. Student[] stus=new Students[2];
  21. Student s1=new Student();
  22. Student s2=new Student();
  23. s1.age=1;
  24. s1.name=Arrays.copyOf("k1".getBytes(), 20);
  25. s2.age=2;
  26. s2.name=Arrays.copyOf("k2".getBytes(),20);
  27. stus[0]=s1; //数组赋值
  28. stus[1]=s2;
  29. Gui.gui.changeObjs(stus, stus.length);

运行报错:

Structure array elements must use contiguous memory (bad backing address at Structure array index 1)

结构体数组必须使用连续的内存区域, 上例s1,s2都是new出来的新对象,不可能连续; 也就是说传统方式的初始化数组不能解决, 查询JNA api发现里面提供了:

toArray

public Structure[] toArray(int size)

Returns a view of this structure's memory as an array of structures. Note that this Structure must have a public, no-arg constructor. If the structure is currently using a Memory backing, the memory will be resized to fit the entire array.

修改后的代码:

  1. // 测试对象数组
  2. Student student=new Student();
  3. Student[] stus=(Student[]) student.toArray(2); //分配大小为2的结构体数组
  4. stus[0].age=1;
  5. stus[0].name=Arrays.copyOf("k1".getBytes(), 20);
  6. stus[1].age=2;
  7. stus[1].name=Arrays.copyOf("k2".getBytes(),20);
  8. Gui.gui.changeObjs(stus, stus.length);

http://tcspecial.iteye.com/blog/1665583  //原文地址

JNA结构体参数传递,Java数组的更多相关文章

  1. c&num;中关于结构体和字节数组转化

    最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System ...

  2. C&num;结构体和字节数组的转换函数

    在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到.   一般都会采用结构来表示字节数组.但结构 ...

  3. 【VS开发】【编程开发】【C&sol;C&plus;&plus;开发】结构体中的数组与指针的内存分配情况说明

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  4. c&num; 调用c&plus;&plus;sdk时结构体与byte数组互转

    /// <summary> /// 由结构体转换为byte数组 /// </summary> public static byte[] StructureToByte<T ...

  5. c&plus;&plus;与C&num; winform的消息通讯--(结构体与byte数组的使用)

    近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 b ...

  6. C语言结构体中字符数组的问题

    第一个程序 #include <stdio.h> #include <string.h> typedef struct student { char name[10]; int ...

  7. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  8. c动态分配结构体二维数组

    这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个.希望这篇文章能够帮助你们. #include <stdio.h> #include <stdlib.h ...

  9. c结构体里的数组与指针

    /* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct ...

随机推荐

  1. Dom随手记

    设置用户粘贴板中的文本信息:window.clipboardData.setData('Text', location.href); 获取用户粘贴板中的文本信息: window.clipboardDa ...

  2. MYCAT 安装&lpar;转&rpar;

    1.安装JAVA环境JDK 基于JAVA开发,所以需要安装JDK 2.下载安装Mycat https://github.com/MyCATApache/Mycat-download 本次安装1.5版本 ...

  3. 关于js性能

    1,声明变量要赋初值2,尽量避免声明全局变量,可以减少与系统的重名3,当编写大量js代码时,难免会遇到命名冲突,这是可以通过模拟命名空间方式     来避免冲突4,尽量避免使用全局变量,搜索全局变量是 ...

  4. &lbrack;MVCSharp&rsqb;MVC&num; Overview概述

    MVC# Overview概述 Abstract: This article gives an overview of MVC# - a Model-View-Presenter framework ...

  5. 十大谷歌Google搜索技巧分享

    前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...

  6. &lbrack;ionic开源项目教程&rsqb; - 第6讲 过滤器filter的使用

    过滤器filter的使用 1.回顾 再熟悉一下tab1.html的代码: <div class="list"> <a ng-repeat="item i ...

  7. 【转载】JAVA IO 流的总结

    来自http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html,写的很详细 Java流操作有关的类或接口: Java流类图结构: 流的概念和 ...

  8. j2ee爬坑行之二 servlet

    servlet生命周期 web容器加载servlet 类 web容器调用servlet的构造函数,初始化servlet. web容器调用servlet的init()方法.注意该方法在servlet的一 ...

  9. 项目上传svn出问题

    我在自己的笔记本上(win8),安装了tortoise 1.9.4和visualSVN server 3.5.3.我现在想让eclipse的自带的svn插件连接到本地服务器的资源库上.但是我写http ...

  10. Java相关面试题总结&plus;答案(二)

    [容器] 18. Java 容器都有哪些? 19. Collection 和 Collections 有什么区别? Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法, ...