栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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
提供不需要空数组的重载。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/617186.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号