2012-08-14 49 views
6

我有这样的事情:访问从Java结构内的指针数组与痛饮

typedef struct { 
    char * content; 
} Boo; 

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

我想Boo ** data转换为与Boo元素(Boo[])在Java中使用SWIG的数组。然后读取数组(我不想编辑,删除并从Java代码创建一个新的数组)。在SWIG文档中描述了如何使用carrays.iarray_functions来完成此操作,但结构的成员data必须是Boo*。有没有解决我的问题?

编辑: 我匆匆忙忙,我忘了写我想用SWIG生成Java类来与C结构合作。

+0

除非你给'Foo'增加一个长度,否则这听起来完全不可能,因为你不能单独从指针中神奇地推导出长度。 – unwind 2012-08-14 12:36:30

+0

@unwind对不起,我忘了添加'size'成员。我编辑了我的问题。 – 2012-08-14 12:39:30

+0

假设您的数据结构中有3个以上的元素。你将如何访问第三个元素?假设你有一个对象'Foo x',其中'x.size> = 3'。 – pmg 2012-08-14 12:45:56

回答

3

该解决方案非常简单。就在痛饮接口使用:

%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

你总是可以做一个malloc,例如一维选项卡将是:

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你的标签做

否则以后就必须使用自由,将其更改为嘘在编译之前,data []或data [] []将需要精确数量的结构库存。

+0

方法对不起。我没有写下正确的问题。你能再读一遍吗? – 2012-08-14 13:03:40