2010-11-23 29 views
8

我正在爲一些C++代碼編寫一些SWIG/Python綁定。這就是所謂的Kinect Accidental API,我有電機和LED功能working。對解析和填充RGB和Depth緩衝區的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++中增加了一個最小的監聽器,現在剩下的工作是使用typemaps有效地訪問數組。目前我正在使用這個天真的類型地圖

%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

有一種使用導向器功能的方法。 啓用它爲您KinectListener代理,一行代碼:

%feature("director") KinectListener 

然後你可以從KinectListener類繼承的Python代碼和定義的功能。

+0

我有同樣的問題 - N0vember的回答回答它。不是接收指向要調用的函數的指針,而是接收一個指向多態類的指針,在該類中您知道要調用的函數的名稱。 – Jonathan 2011-02-05 06:14:00

2

巧合的是,我碰巧正在用SWIG調查回調。

SWIG 2.0 documentation says this

SWIG提供函數指針完全支持提供的回調函數在C中定義,而不是在目標語言。 ...但是,現有的C函數可以用作參數,只要您將它們安裝爲常量即可。一種方法是使用像這樣的%常量指令...

我打算用手寫的JNI編寫一個C回調函數來調用Java。如果還有其他方法,我也很樂意聽到它。