2010-11-23 18 views
8

いくつかのC++コード用のSWIG/Pythonバインディングをいくつか書いています。これはKinect Accidental APIと呼ばれています。私はモーターを持っており、機能はworkingです。 RGBと深度バッファを解析して取り込むListenerクラスへのコールバックはSWIGから呼び出されないようです。明らかにデータキャプチャスレッドが起動してCPUを起動しますが、コールバックからのデバッグ行は出力されません。データバッファにデータを格納し、Pythonから簡単にアクセスできるようにするにはどうすればよいでしょうか?ここでコールバック付きSWIG C++バインディング

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); 
    } 
} 

良いオプションはありますか?

答えて

3

ディレクター機能を使用する方法があります。

%feature("director") KinectListener 

は、その後、あなたがPythonコードでKinectListenerクラスから継承し、あなたの関数を定義することができます。 コードの1行、あなたのKinectListenerプロキシのためにそれを有効にします。

+0

私は同じ質問をしました - N0vemberの応答はそれに答えます。呼び出す関数へのポインタを受け取る代わりに、呼び出す関数の名前を知っているポリモフィッククラスへのポインタを受け取ります。 – Jonathan

2

偶然にも、現時点ではSWIGのコールバックを調べています。 SWIG 2.0 documentation says this

SWIGは、関数ポインタの完全なサポートは、コールバック関数は、ターゲット言語でCで定義されていないことを条件とする提供します。 ...しかし、既存のC関数は、定数としてインストールした場合に引数として使用できます。これを行うための1つの方法は、このような%constantディレクティブを使うことです。

手書きのJNIでCコールバックを作成してJavaに呼び出すことを計画しています。別の方法があれば、私もそれを聞くのが大好きです。

関連する問題