将 SWIG 类型映射与 java 结合使用

Using SWIG typemaps with java

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

%typemap(argout) track_t **phash_tracks {
  %append_output(SWIG_NewPointerObj(%as_voidptr(*), $*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;
   = &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 没有替换它为了任何东西。这也导致了许多编译时错误之一..

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

来自manual

Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java.

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

如果你编写正确的类型映射可以与语言无关,但是一旦你开始编写自定义类型映射而不是依赖 SWIG 库之外的类型映射,它很快就不再是通用的。在使用 SWIG 制作通用界面和让目标语言的用户也感到 "right" 的界面之间需要权衡。