SWIG C++ 绑定与回调
我正在为一些C++代码编写SWIG/Python的绑定。这是为了一个叫做Kinect Accidental API的项目,我已经让电机和LED功能正常工作。不过,Listener类中的回调函数,用来解析和填充RGB和深度数据的,似乎没有从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) {};
};
这是带有虚拟方法的Listener类,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);
}
}
有没有更好的选择呢?
2 个回答
3
碰巧我现在正在研究SWIG中的回调函数。
SWIG完全支持函数指针,只要回调函数是在C语言中定义的,而不是在目标语言中……不过,现有的C函数可以作为参数使用,只要你把它们安装为常量。实现这一点的一种方法是使用%constant指令,像这样……
我打算写一个C语言的回调函数,并手动编写JNI来调用Java。如果有其他方法,我也很想知道。
3
可以通过使用“导演”这个功能来实现。
只需为你的KinectListener代理启用这个功能,代码只需要一行:
%feature("director") KinectListener
接着,你就可以在Python代码中继承KinectListener类,并定义你自己的函数了。