使用SWIG与数组进行交互的正确方法

使用SWIG与数组进行交互的正确方法,第1张

使用SWIG与数组进行交互的正确方法

不要自动打折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
提供不需要空数组的重载。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5623276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存