繁体   English   中英

SWIG C ++绑定回调

[英]SWIG C++ bindings with callback

我正在为一些C ++代码编写一些SWIG / Python绑定。 这是所谓的Kinect的意外API,我有电机和LED功能的工作 解析和填充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);
  }
}

更好的选择?

巧合的是,我恰好正在调查SWIG的回调。

SWIG 2.0文档说明了这一点

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

我打算用手写的JNI写一个C回调来调用Java。 如果有另一种方式,我也很乐意听到它。

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

%feature("director") KinectListener

然后你可以在python代码中继承KinectListener类并定义你的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM