SWIG C ++ привязки с обратным вызовом - PullRequest
8 голосов
/ 23 ноября 2010

Я пишу некоторые привязки SWIG / Python для некоторого кода C ++.Это то, что называется Kinect Accidental API, у меня есть функции двигателя и светодиода , работающие .Обратные вызовы класса Listener, которые анализируют и заполняют буферы RGB и Depth, похоже, не вызываются из SWIG.Потоки захвата данных, очевидно, запускаются и начинают загружать процессор, но никакие строки отладки обратного вызова не проходят.Что может быть лучше для заполнения буферов данных и легкого доступа к ним из 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 ++, и теперь остальной работой является эффективный доступ к массивам с помощью карт типов.В настоящее время я использую эту наивную карту типов

%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 голосов
/ 29 декабря 2010

Есть способ, использующий функцию директоров. Включите его для вашего прокси KinectListener, одну строку кода:

%feature("director") KinectListener

Затем вы можете наследовать от класса KinectListener в коде Python и определять свои функции.

3 голосов
/ 30 ноября 2010

По стечению обстоятельств я в настоящее время изучаю обратные вызовы с SWIG.

В документации SWIG 2.0 сказано, что :

SWIG предоставляет полныйподдержка указателей функций при условии, что функции обратного вызова определены на C, а не на целевом языке.... Однако существующие функции C могут использоваться в качестве аргументов, если вы устанавливаете их как константы.Один из способов сделать это - использовать директиву% constant следующим образом ...

Я планирую написать обратный вызов C с рукописным JNI для вызова в Java.Если есть другой способ, я также хотел бы услышать это.

...