如果我有一个C函数(见下文),它返回一个指向数组的unsigned char指针。您将如何指示SWIG绑定到getFoo()的Java ArrayList数据类型。我不确定ArrayList是否可行,也许是一个数组(本例中为String [])。我想保持getFoo的Java返回类型尽可能通用,因为C getFoo可能返回int,double,char..etc数组。
unsigned char * getFoo(int32_t *length){
static unsigned char foo[44];
foo[0]='a';
foo[1]='b';
foo[2]='c';
foo[3]='d';
return foo;
}
答案 0 :(得分:1)
最通用的答案是在Java中将结果公开为unbouned C array:
%module test
%include "carrays.i"
%array_class(unsigned char, ucArray);
unsigned char *getFoo();
这会生成一个名为ucArray
的类,它为特定索引获取和设置。它是无界的,具有与C数组相同的语义,但是轻量级且可用。由于它没有限制,你可以从Java调用未定义的行为,它没有任何界限,因此无法用作Iterator
或Collection
。
如果你的数组被NULL / 0终止,那么使用%extend
来实现Java Iterable
接口也是相当容易的,粗略的,未经测试的例子:
%typemap(javainterfaces) ucArray "java.lang.Iterable<Short>"
%typemap(javacode) ucArray %{
public java.util.Iterator<Short> iterator() {
return new java.util.Iterator<Short>() {
private int pos = 0;
public Short next() {
// Mmmm autoboxing!
return getitem(pos++);
}
public void remove() {
throw new UnsupportedOperationException();
}
public boolean hasNext() {
// Check if we're at the end. A NULL/0 element represents the end
return getitem(pos) != 0;
}
};
}
%}
这需要在调用%array_class
宏之前去某处。它说我们的ucArray
类将实现Iterable
,然后使用iterator()
(Iterable
接口的唯一方法)方法中的匿名内部类来实现该接口Iterator
界面。