SWIG C ++ Bindungen mit dem Rückruf
Frage
Ich schreibe einige SWIG / Python-Bindings für einige C ++ Code. Dies ist für das, was die Kinect Accidental API genannt wird, habe ich den Motor und führte Funktionen Arbeits . Die Rückrufe an die Listener-Klasse, die Parse und bevölkern die RGB- und Tiefe Puffer scheinen nicht von SWIG genannt werden. Die Datenerfassung Threads beginnt offenbar und starten Sie die CPU in Beschlag, aber keine Debug-Zeilen aus dem Rückruf kommen durch. Was wäre besser Weise zu bevölDatenPuffer sein und Zugriff auf sie leicht aus 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) {};
};
Hier ist die Listener-Klasse mit den virtuellen Methoden kann der Python wickelte Version dieser Klasse zu erben Zuhörer für die C ++ Klasse verwendet werden? Ich habe einen minimalen Zuhörer in C ++ und jetzt die verbleibende Arbeit ist es, die Arrays mit typemaps effizient zuzugreifen. Derzeit bin ich mit diesem naiven typemap
%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);
}
}
Bessere Optionen?
Lösung
Es gibt einen Weg, um die Direktoren-Funktion. Aktivieren Sie es für Ihre KinectListener Proxy, eine Codezeile:
%feature("director") KinectListener
Dann können Sie von KinectListener Klasse in Python-Code erben und Ihre Funktionen definieren.
Andere Tipps
Durch Zufall passieren ich im Moment in Rückrufe mit SWIG suchen werden.
Die SWIG 2.0-Dokumentation sagt dieser :
bietet SWIG volle Unterstützung für Funktionszeiger vorgesehen, dass die Callback-Funktionen definiert sind, in C und nicht in der Zielsprache. ... Allerdings können vorhandene C-Funktionen verwendet werden als Argumente, sofern Sie sie als Konstanten installieren. Eine Möglichkeit, dies zu tun, ist die% konstant Richtlinie wie folgt verwenden ...
Ich plane einen C-Callback mit handgeschriebenen JNI schreiben in Java zu nennen. Wenn es eine andere Möglichkeit ist, würde ich auch gerne hören.