带有回调的 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 绑定 Python/C++ 模板

我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定吗?

Swig - 绑定一个返回对导向器类指针的引用的方法

如何为 wchar_t 定义 swig typmap 以与 Perl 脚本绑定?

使用 SWIG 从 Ruby 调用 C 回调