带有回调的 SWIG C++ 绑定
Posted
技术标签:
【中文标题】带有回调的 SWIG C++ 绑定【英文标题】:SWIG C++ bindings with callback 【发布时间】:2010-11-23 12:03:01 【问题描述】:我正在为一些 C++ 代码编写一些 SWIG/Python 绑定。这是用于所谓的 Kinect Accidental API,我有电机和 LED 功能working。解析和填充 RGB 和深度缓冲区的 Listener 类的回调似乎没有从 SWIG 调用。数据捕获线程显然启动并开始占用 CPU,但回调中没有调试行通过。填充数据缓冲区并从 python 轻松访问它们的更好方法是什么?
class KinectListener
public:
virtual ~KinectListener();
virtual void KinectDisconnected(Kinect *K) ;
virtual void DepthReceived(Kinect *K) ;
virtual void ColorReceived(Kinect *K) ;
virtual void AudioReceived(Kinect *K) ;
;
这里是带有虚方法的监听器类,这个类的Python包装版本可以用来继承c++类的监听器吗?我在 C++ 中添加了一个最小的侦听器,现在剩下的工作是使用类型映射有效地访问数组。目前我正在使用这个幼稚的类型图
%typemap(out) unsigned short [ANY]
int i;
$result = PyList_New($1_dim0);
for (i = 0; i < $1_dim0; i++)
PyObject *o = PyInt_FromLong((long)$1[i]);
PyList_SetItem($result,i,o);
更好的选择?
【问题讨论】:
【参考方案1】:有一种使用导演功能的方法。 为您的 KinectListener 代理启用它,一行代码:
%feature("director") KinectListener
然后你可以在 python 代码中继承 KinectListener 类并定义你的函数。
【讨论】:
我有同样的问题 - N0vember 的回答回答了它。与其接收指向要调用的函数的指针,不如接收指向多态类的指针,在该类中您知道要调用的函数的名称。【参考方案2】:巧合的是,我目前正在研究 SWIG 的回调。
SWIG 2.0 documentation says this:
SWIG 提供对函数指针的完全支持,前提是回调函数是用 C 语言而不是目标语言定义的。 ...但是,现有的 C 函数可以用作参数,前提是您将它们安装为常量。一种方法是像这样使用 %constant 指令...
我打算用手写的 JNI 编写一个 C 回调来调用 Java。如果有其他方法,我也很想听。
【讨论】:
以上是关于带有回调的 SWIG C++ 绑定的主要内容,如果未能解决你的问题,请参考以下文章
SWIG (Java):如何将带有回调函数的结构从 Android 应用程序传递给 C++?
我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定吗?