使用SWIG从Java访问结构中的指针数组

时间:2012-08-14 12:33:41

标签: java c swig

我有这样的事情:

typedef struct {
    char * content;
} Boo;

typedef struct {
    Boo **data;
    int size;
} Foo;

我希望使用SWIG将Boo ** data转换为带有Boo元素(Boo[])的数组。然后读取数组(我不想编辑,删除并从Java代码创建一个新数组)。在SWIG文档中介绍了如何使用carrays.iarray_functions执行此操作,但结构的成员data必须是Boo*类型。我的问题有解决方案吗?

编辑: 我已经匆匆而且忘记写了我想用SWIG生成Java类来与C结构合作。

2 个答案:

答案 0 :(得分:3)

解决方案非常简单。只需在swig界面中使用:

%include <carrays.i>
%array_functions(Boo *, boo_array);

然后从java访问:

SWIGTYPE_p_p_Boo results = foo.getData();
for(int i = 0; i < foo.getSize(); i++) {
    Boo booResult = foo.boo_array_getitem(results, i);
}

检索数组的内容。

答案 1 :(得分:1)

你总是可以做一个malloc,1d标签的例子是:

int main (void)                                                          
 {                                                                
    int   size;                                                        
    Foo a;

  size = 2;
  if (!(a.data = malloc(size * sizeof(*(a.data)))))
   return (-1);
    // so you will have a.data[0] or a.data[1] ...

    //   for malloc on 2d                                   
    //   if (!(a.data[0] = malloc(size * sizeof(*(a.data)))))                
    //    return (-1);                                                     
  return 0;
 }

但是,自从你启动malloc后,你必须在完成选项卡后使用免费

否则,在编译之前将其更改为boo data []或data [] []需要精确数量的struct。