【问题标题】:SWIG C++ bindings with callback带有回调的 SWIG C++ 绑定
【发布时间】: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);
  }
}

更好的选择?

【问题讨论】:

    标签: c++ python swig kinect


    【解决方案1】:

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

    %feature("director") KinectListener
    

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

    【讨论】:

    • 我有同样的问题 - N0vember 的回答回答了它。与其接收指向要调用的函数的指针,不如接收指向多态类的指针,在该类中您知道要调用的函数的名称。
    【解决方案2】:

    巧合的是,我目前正在研究 SWIG 的回调。

    SWIG 2.0 documentation says this:

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

    我打算用手写的 JNI 编写一个 C 回调来调用 Java。如果有其他方法,我也很想听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      相关资源
      最近更新 更多