SWIG C ++ attacchi con callback
Domanda
Le scrivo alcuni binding SWIG / Python per un po 'di codice C ++. Questo è per quello che è chiamato l'API Kinect accidentale, ho funzioni motorie e guidati lavoro . I callback alla classe Listener che analizzare e popolare il buffer RGB e profondità non sembrano vengono chiamati da SWIG. I fili di acquisizione dati, evidentemente, start up e iniziare monopolizzavano la CPU, ma senza linee di debug dalla richiamata venire attraverso. Quale sarebbe modo migliore per buffer di dati popolamento e facilmente accedervi da 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) {};
};
Questa è la classe ascoltatore con i metodi virtuali, può la versione di Python avvolto di questa classe essere usata per gli ascoltatori ereditano per la classe C ++? Ho aggiunto un ascoltatore minima in C ++ e ora il lavoro rimanente è per accedere alle matrici efficiente con typemaps. Attualmente sto usando questo typemap ingenuo
%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);
}
}
Opzioni migliori?
Soluzione
C'è un modo utilizzando la funzione di direttori. Attiva per il proxy KinectListener, una riga di codice:
%feature("director") KinectListener
Poi si può ereditare dalla classe KinectListener nel codice Python e definire le funzioni.
Altri suggerimenti
Per coincidenza, mi capita di essere alla ricerca in callback con SWIG al momento.
Il href="http://www.swig.org/Doc2.0/SWIGDocumentation.html#SWIG_nn30" rel="nofollow"> SWIG documentazione :
SWIG fornisce il supporto completo per i puntatori a funzione, a condizione che le funzioni di callback sono definite in C e non nella lingua di destinazione. ... Tuttavia, le funzioni C esistenti possono essere utilizzati come argomenti forniti di installarle come costanti. Un modo per farlo è quello di utilizzare la direttiva% costante come questo ...
ho intenzione di scrivere un callback C con JNI scritta a mano a rimettere in Java. Se c'è un altro modo, mi piacerebbe anche sentire.