将 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_ConvertPtr
、SWIG_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" 的界面之间需要权衡。
我已经在目标语言为 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_ConvertPtr
、SWIG_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" 的界面之间需要权衡。