2010-11-23 3 views
8

일부 C++ 코드에 대한 SWIG/Python 바인딩을 작성 중입니다. 이것은 Kinect Accidental API라고 불리는 것입니다. 저는 모터와 led 기능이 있습니다. working. RGB 및 깊이 버퍼를 구문 분석하고 채우는 Listener 클래스에 대한 콜백은 SWIG에서 호출되지 않는 것 같습니다. 데이터 캡처 스레드가 분명히 시작되어 CPU를 호깅하기 시작하지만 콜백의 디버그 라인은 나오지 않습니다. 데이터 버퍼를 채우고 파이썬에서 쉽게 액세스 할 수있는 방법은 무엇입니까? 여기 콜백 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) {}; 
}; 

는 파이썬이 클래스의 버전은 C++ 클래스의 청취자를 상속하는 데 사용할 수 싸서 수, 가상 방법에 리스너 클래스입니다? C++에서 최소한의 리스너를 추가 했으므로 나머지 작업은 typemap을 사용하여 효율적으로 배열에 액세스하는 것입니다. 현재이 순진한 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); 
    } 
} 

더 나은 옵션은 있습니까?

답변

3

감독 기능을 사용하는 방법이 있습니다.

%feature("director") KinectListener 

이 그럼 당신은 파이썬 코드에 KinectListener 클래스에서 상속 및 기능을 정의 할 수 있습니다 한 줄의 코드, 당신의 KinectListener의 프록시를 사용합니다.

+0

동일한 질문이있었습니다. N0vember의 답변이 이에 대한 답입니다. 호출 할 함수의 포인터를받는 대신 호출 할 함수의 이름을 알고있는 다형 클래스에 대한 포인터를받습니다. – Jonathan

2

우연의 일치로, 나는 순간에 SWIG와 콜백을 조사하고 있습니다. SWIG 2.0 documentation says this

:

SWIG는 함수 포인터에 대한 완전한 지원이 콜백 함수는 목표 언어 C에서 정의되지 않은 것을 제공합니다. ... 그러나 기존 C 함수는 상수로 설치 한 경우 인수로 사용할 수 있습니다. 이를 수행하는 한 가지 방법은 다음과 같은 % constant 지시문을 사용하는 것입니다.

자바로 호출하기 위해 손으로 작성한 JNI로 C 콜백을 작성할 계획입니다. 다른 방법이 있다면, 나는 또한 그것을 듣고 싶습니다.