SWIG C ++与回调绑定

我正在为一些C ++代码编写一些SWIG / Python绑定。 这就是所谓的Kinect Accidental API,我有电机和led功能的工作。 对解析和填充RGB和Depth缓冲区的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 ++中增加了一个最小的监听器,现在剩下的工作是使用typemaps有效地访问数组。 目前我正在使用这个天真的typemap

%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);
  }
}

更好的选择?


有一种使用导向器功能的方法。 为您的KinectListener代理启用它,一行代码:

%feature("director") KinectListener

然后,您可以在Python代码中继承KinectListener类并定义您的函数。


巧合的是,我恰好正在考虑用SWIG进行回调。

SWIG 2.0文档说明了这一点:

SWIG提供对函数指针的全面支持,前提是回调函数在C中定义,而不在目标语言中定义。 ...但是,现有的C函数可以用作参数,只要您将它们安装为常量即可。 一种方法是使用像这样的%常量指令...

我打算用手写的JNI编写一个C回调函数来调用Java。 如果还有其他方法,我也很乐意听到它。

链接地址: http://www.djcxy.com/p/48325.html

上一篇: SWIG C++ bindings with callback

下一篇: Performance comparison of Thrift, Protocol Buffers, JSON, EJB, other?