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

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

上一篇:bind,unbind,one


下一篇:Jquery中$(document).ready() 和 JavaScript中的window.onload方法 比较