不要自动打折carrays.i。也就是说,SWIG已经有了一些方便的类型映射:
%module test%apply(char *STRING, size_t LENGTH) { (char *str, size_t len) };%inline %{void some_func(char *str, size_t len) {}%}
它在Java接口中产生一个函数:
public static void some_func(byte[] str)
也就是说,它需要一个可以像普通一样在Java中构建的数组,并为您填充指针和长度。几乎免费。
几乎可以肯定的是,您的代码会泄漏-您希望
free()在argout类型映射中调用,以在将分配的内存复制到新的Java数组后释放释放的内存。
您可以通过参数的类型 和
名称来选择性地应用类型图。有关类型映射匹配规则的更多信息,请参见本文档。您还可以请求显式地使用typemap,否则将无法
%apply如我在上面的示例中那样使用它。(实际上,它会复制类型图,因此,如果您仅修改其中之一,则一般情况下不会替换它)
通常,用于数组从Java到C 或使用已知大小的数组的类型映射要比从C 返回到Java的类型映射更简单,因为大小信息更加明显。
我的建议是计划在Java内部进行大量分配工作,并设计可能会使数组增长以两种模式 *** 作的函数:一种指示所需的大小,另一种实际完成工作。您可以这样做:
ssize_t some_function(char *in, size_t in_sz) { if (in_sz < the_size_I_need) { return the_size_I_need; // query the size is pretty fast } // do some work on in if it's big enough // use negative sizes or exceptions to indicate errors return the_size_I_really_used; // send the real size back to Java}
这将使您可以在Java中执行以下 *** 作:
int sz = module.some_function(new byte[0]);byte result[] = new byte[sz];sz = module.some_function(result);
请注意,使用默认的typemap
new byte[0]是必需的,因为它们不允许
null用作数组-
如果需要,您可以添加允许使用此类型的typemap,或者用于
%extend提供不需要空数组的重载。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)