我有这样的头文件(fingisdk.h):
#ifndef FINGISDK_H_
#define FINGISDK_H_
#include "fingienum.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*fingi_event)(FINGI_EVENT_ID eventId, char* msg);
FINGI_EVENT_ID start_fingi_sdk(char* ini_file_location);
FINGI_EVENT_ID download_room_info(char** roominfo);
void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);
#ifdef __cplusplus
}
#endif
#endif
然后我为这个编写了一个python包装器:
^{pr2}$调用它的python文件如下:
import libpythonWrapper
print libpythonWrapper.start_fingi_sdk('file_location.ini')
到目前为止,这个还不错。但是,我不知道如何暴露双指针 功能:
FINGI_EVENT_ID download_room_info(char** roominfo);
和回调函数:
void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);
有人能给我指一些文件或帮助我解决它吗
谢谢
编辑1:
经过一番折腾,我想出了如何实现指针到指针的函数。Python不支持指针,因此必须包装下载的\u room_info(char**roominfo)以返回简单字符串:
std::string download_room_info_python_wrapper() {
char * value;
FINGI_EVENT_ID result = download_room_info(&value);
return std::string(value);
}
然后:
def("download_room_info", download_room_info_python_wrapper);
仍在寻找回调函数的解决方案
因此,您希望将此API绑定到Python:
这是一个register函数,它接受一个eventId和一个字符串的函数。好,让我们定义一个我们自己的(当然,在外部“C”中,就像API一样):
^{pr2}$现在我们可以为register函数编写一个包装器:
把它绑起来:
这应该都管用。但这没用,因为我们实际上在回调中什么都没做。所以这就引出了一个子问题,那就是如何在回调中做任何事情?我的一个想法是,您应该建立自己的函数注册机制,该机制允许您将Python回调函数注册到全局PyObject中,该对象将被设置为Python函数并使用Boost Python调用:
现在只需要让用户分配全局回调:
然后在Python中:
我想应该就是这样了。如果您的回调API像许多回调API一样支持“void*userData”参数,那么整个事情就会简单得多。然后我们用它来存储PyObject或其他有用的东西。但是API缺少这一点,所以我们需要一个全局的地方来记住调用哪个函数。在
相关问题 更多 >
编程相关推荐