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

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

Java代码  

  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.

修改后的代码:

Java代码  

  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  //原文地址

时间: 2024-10-27 11:56:59

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

JNA结构体数组

本文主要讲述使用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 { //Structu

c#中关于结构体和字节数组转化

最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace FileSendClient { [StructL

C#结构体和字节数组的转换函数

在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到. 一般都会采用结构来表示字节数组.但结构与字节数组直接的转换实在很麻烦. 字节操作不但容易出错,而且每增加一个结构,就自己实现一遍,实在是烦不胜烦. 有没有简单的方法呢?当然有.可以采用非托管区的一些方法来实现. 首先,导入命名空间:System.Runtime.InteropServices; 定义结构的时候,要给结构指定特性. 如: //

c语言结构体中动态数组的使用

[背景] c语言结构体中动态数组使得用户能够根据需要来申请空间,相比静态数组,更能有效利用存储空间. [正文] 1. 动态数组在结构体中间 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int a; char buf[0]; // 或者char buf[]; int b; }Node; int main() { printf("%d\n", si

Go -- 中结构体与字节数组能相互转化

编码时如下,假设默认你的结构体为data func Encode(data interface{}) ([]byte, error) { buf := bytes.NewBuffer(nil) enc := gob.NewEncoder(buf) err := enc.Encode(data) if err != nil { return nil, err } return buf.Bytes(), nil } 解码时如下,data为需要解码的字节数组,to为相应的接收结构体,记住to的结构体结

c++与C# winform的消息通讯--(结构体与byte数组的使用)

近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 byte数组(硬件开发常用)等如何进行处理. 首先c++里面要建立一个dll文件: 1 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved) 2 { 3 switch (ul_reason

c结构体里的数组与指针

/* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct foo { buf_str* pbuf; }; void test_funny() { foo f = {0}; printf("%x\n", f.pbuf); printf("%x\n", &f.pbuf->length); printf("%

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

这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个.希望这篇文章能够帮助你们. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stddef.h> 4 5 typedef struct LNode { 6 int F; 7 struct LNode* next; 8 }LNode, *LinkList; 9 int main() 10 { 11 LNode** map = (LNo

3. file、inode结构体及chardevs数组等相关知识解析

https://blog.csdn.net/zqixiao_09/article/details/50850004 下图描述了Linux中虚拟文件系统,一般的设备文件与设备驱动程序间的函数调用关系 上图展现了一个应用程序调用字符设备驱动的过程,在设备驱动程序的设计中,一般而言,会关系file和inode这两个结构体. 用户空间使用open()函数打开一个字符设备fd = open("/dev/hello", o_READ);这一函数会调用两个数据结构struct inode{}&