我已成功在目标语言为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_ConvertPtr
,SWIG_POINTER_DISOWN
等声明的python案例中的swig包装器代码的代码来自swigrun.swg
位于/usr/share/swig2.0/
当目标语言是java时,此等效代码不会粘贴到swig包装器代码中。我不完全确定为什么没有发生这种情况,因为没有它,由于所有缺少的声明都需要编译,它无法编译。
我的swig设置是否有问题,或者我是否遇到了基本的误解,例如你不能使用java或类似的东西?
我还在java的c封装代码中注意到,接口文件中的%append
在自动生成的.c文件中逐字显示,即swig没有替换它。这也导致了许多编译时错误之一..
答案 0 :(得分:2)
Python的类型系统与Java非常不同,因此SWIG运行时也不同。
来自manual:
Java是SWIG中为数不多的非脚本语言模块之一。由于SWIG使用Java语言提供的类型安全性,因此它采用与脚本语言不同的方法。特别是Java不使用运行时类型检查和运行时库。
你仍然可以为Java编写类型图,但由于强类型,它们最终需要相当不同,而SWIG_ConvertPtr
等函数根本不存在,因为它们不是必需的。
如果您正确地编写它们,则类型映射可以与语言无关,但是一旦您开始编写自定义类型映射而不是依赖于SWIG库之外的那些,它就很快就不再是通用的。在制作具有SWIG的通用接口和感觉"正确"之间的接口之间需要权衡利弊。也是目标语言的用户。