SWIG C ++ Ligações com retorno de chamada
Pergunta
Estou escrevendo algumas ligações SWIG/Python para algum código C ++. Isto é para o que é chamado de API acidental Kinect, eu tenho o motor e as funções de LED trabalhando. Os retornos de chamada para a classe do ouvinte que analisam e preenchem os buffers RGB e de profundidade não parecem ser chamados do SWIG. Os threads de captura de dados evidentemente começam e começam a monopolizar a CPU, mas nenhuma linha de depuração do retorno de chamada é adquirida. Qual seria a melhor maneira de preencher os buffers de dados e acessá -los facilmente do 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) {};
};
Aqui está a classe do ouvinte com os métodos virtuais, a versão Python embrulhada desta classe pode ser usada para herdar ouvintes para a classe C ++? Adicionei um ouvinte mínimo no C ++ e agora o trabalho restante é acessar as matrizes com eficiência com o TypeMaps. Atualmente estou usando este tipo de tipo ingênuo
%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);
}
}
Melhores opções?
Solução
Existe uma maneira de usar o recurso de diretores. Habilite -o para o seu proxy KinectListener, uma linha de código:
%feature("director") KinectListener
Em seguida, você pode herdar da classe KinectListener no código Python e definir suas funções.
Outras dicas
Por coincidência, estou olhando para retornos de chamada com SWIG no momento.
o A documentação do Swig 2.0 diz isso:
O SWIG fornece suporte total para ponteiros de função, desde que as funções de retorno de chamada sejam definidas em C e não no idioma de destino. ... No entanto, as funções C existentes podem ser usadas como argumentos, desde que você as instale como constantes. Uma maneira de fazer isso é usar a diretiva %constante como esta ...
Estou planejando escrever um retorno de chamada C com o JNI escrito à mão para ligar para o Java. Se houver outra maneira, eu também adoraria ouvi -lo.