Привязки SWI C ++ с обратным вызовом
Вопрос
Я пишу несколько привязки SWIG / Python для некоторых C ++. Это для того, что называется случайным API Kinect, у меня есть функции двигателя и светодиодных функций работающий. Отказ Обратные вызовы класса прослушивателя, которые разбирают и заполняют буферы RGB и глубины, кажется, не вызываются от 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) {};
};
Вот класс прослушивателя с виртуальными методами, может ли питон завернул версию этого класса для наследства слушателей для класса C ++? Я добавил минимальный слушатель в C ++, и теперь оставшаяся работа - эффективно доступа к массивам с помощью типов. В настоящее время я использую этот наивный типографскийap
%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
Затем вы можете наследовать от класса KinectListener в коде Python и определить ваши функции.
Другие советы
По совпадению, я ищу обратных вызовов с Swig в данный момент.
То Документация Swig 2.0 говорит это:
SWIV обеспечивает полную поддержку указателей по функциям при условии, что функции обратного вызова определены в C, а не на целевом языке. ... Тем не менее, существующие функции C могут использоваться в качестве аргументов при условии, что вы устанавливаете их в качестве постоянных. Один из способов сделать это - использовать постоянную Директиву, подобную этой ...
Я планирую написать C Callback с рукописными JNI, чтобы позвонить в Java. Если есть другой путь, я бы тоже хотел услышать это.