使用带有java

时间:2016-04-05 15:23:06

标签: java python c swig typemaps

我已成功在目标语言为python的swig接口文件中使用以下typemap:

%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时,当我尝试构建swig产生的自动生成的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));

依旧......

我注意到粘贴到包含SWIG_ConvertPtrSWIG_POINTER_DISOWN等声明的python案例中的swig包装器代码的代码来自swigrun.swg

位于/usr/share/swig2.0/

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

我的swig设置是否有问题,或者我是否遇到了基本的误解,例如你不能使用java或类似的东西?

我还在java的c封装代码中注意到,接口文件中的%append在自动生成的.c文件中逐字显示,即swig没有替换它。这也导致了许多编译时错误之一..

1 个答案:

答案 0 :(得分:2)

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

来自manual

  

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

你仍然可以为Java编写类型图,但由于强类型,它们最终需要相当不同,而SWIG_ConvertPtr等函数根本不存在,因为它们不是必需的。

如果您正确地编写它们,则类型映射可以与语言无关,但是一旦您开始编写自定义类型映射而不是依赖于SWIG库之外的那些,它就很快就不再是通用的。在制作具有SWIG的通用接口和感觉"正确"之间的接口之间需要权衡利弊。也是目标语言的用户。