当前位置: 首页 > 知识库问答 >
问题:

在java中使用SWIG类型映射

包谭三
2023-03-14

我在目标语言为python的swig接口文件中成功地使用了以下类型映射:

%typemap(argout) track_t **phash_tracks {
  %append_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN));
}

%typemap(in) track_t **phash_tracks (track_t *tracks) {
  // Alternatively, check if $input is a 0 integer `PyObject`...
  if ((SWIG_ConvertPtr($input, (void **) &tracks, $*1_descriptor, SWIG_POINTER_DISOWN)) == -1)
    tracks = NULL;
  $1 = &tracks;
}

然而,当我将目标语言更改为java时,当我尝试构建swg生成的自动生成的c包装代码时,我会遇到很多编译时错误,即。

warning: implicit
      declaration of function 'SWIG_ConvertPtr' is invalid in C99 [-Wimplicit-function-declaration]
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1)

error: use of undeclared
      identifier 'SWIG_POINTER_DISOWN'
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1)

error: expected expression
    %append_output(SWIG_NewPointerObj(%as_voidptr(*arg1), SWIGTYPE_p_track_t, SWIG_POINTER_OWN));

等等...

我注意到,在python案例中,粘贴到swig包装器代码中的代码包含swig_ConvertPtrswig_POINTER_DISOWN等声明,这些代码来自swigrun。swg

它位于/usr/share/swig2。0/

当目标语言为java时,此等效代码不会粘贴到swig包装器代码中。我不完全确定为什么不会发生这种情况,因为没有它,它就无法编译,因为类型映射需要所有缺失的声明

我的swig设置是否有问题,或者我是否有一个基本的误解,比如你不能在java中使用typemaps之类的东西?

我还在java的c包装代码中注意到,接口文件中的%append在自动生成的. c文件中逐字出现,即swg没有将其替换为任何内容。这也导致了许多编译时错误之一...

共有1个答案

宿楚青
2023-03-14

Python的类型系统与Java非常不同,因此SWIG运行时也不同。

来自手册:

Java是SWIG中为数不多的非脚本语言模块之一。由于SWIG利用了Java语言提供的类型安全性,因此它采用了与脚本语言不同的方法。特别是Java不使用运行时类型检查和运行时库。

您仍然可以为Java编写typemaps,但由于强类型,它们最终需要相当不同,像SWIG_ConvertPtr这样的函数根本不存在,因为它们不需要。

如果你写得对,字体地图可能与语言无关,但是一旦你开始编写自定义字体地图,而不是依赖SWIG库之外的字体地图,它很快就不再是通用的了。在使用SWIG制作通用接口和对目标语言用户来说感觉“正确”的接口之间存在权衡。

 类似资料:
  • 我在使用SWIG(3.0.6版)围绕C库生成Python包装时遇到了一些问题。 我的问题与应用输出类型映射有关,特别是在类类型的指针/引用的情况下。 为了说明,这就是我想要的标准类型,它是有效的: 您不必传入“resultLong”,但它会自动附加到结果中。太棒了 但是,当输出类型是指向类类型的指针时,这似乎不像我期望的那样工作: 问题似乎是SWIG没有以与简单类型相同的方式处理它。它仍然在包装函

  • 我有一个场景,我必须使用Mapstrt将对象(来自网络请求)转换为对象(数据层)来处理对象映射。我正在尝试创建一个通用的接口,以防止必须为每个资源定义自定义映射器,如下所示: 但这会导致构建错误(但是编译成功): 错误:(13,4)错误:无法为泛型类型变量源生成映射方法。 这不可能吗?如果没有,我将不得不为每个创建一个自定义映射器,并使用根据类类型等告诉反序列化器要使用哪个映射器。。。它可能会变得

  • 我使用SWIG类型映射包装一个类,使用SWIG提供的“std_vector.I”包装这个类的。目标语言是Python。除了我不能在向量上迭代之外,一切似乎都正常。 我创建了一个关于复数的最小示例(仅为方便起见,它与我的真实项目无关)。 这是我想包装的C类: 这是我的SWIG接口文件: 我可以使用以下Python代码简单地测试typecheck/in/out typemaps: 正如您在输出中看到的

  • 我使用javap反编译了Map类。类定义仍然显示泛型类型K和V的存在。这应该被类型擦除的概念擦除。为什么没有发生这种情况? <代码>/javap-详细java。util。地图

  • 我在网上找不到任何在项目中使用gRPC和protobuf的“最佳实践”。我正在实现一个事件源服务器端应用程序。核心定义了域聚合、事件和服务,而没有外部依赖关系。gRPC服务器调用传入请求对象的核心服务,请求对象最终转换为发布的事件。事件使用protobuf序列化,并在线发布。我们目前处于两难境地,是应该直接将事件作为protobuf生成的类,还是应该将核心和事件分开,并实现映射器/序列化器层来在p

  • 我正在尝试为C中的以下函数创建JNI包装器: -输入,-输出 -输入,-输出 其中,定义为: 我完全沉浸在Java的SWIG手册中,因为它不只是支持输入参数作为输出类型。我对Python包装器没有任何问题(如下所示)。