我在C / C ++项目中有这个:
typedef void (*MyCallback) (MyHandle handle, void* context, MyResult result, ... );
int MyMethod(MyHandle handle, void* context, MyCallback cb);
使用 Swig ,我需要为MyMethod创建一个包装器。
我在文档中阅读this section,了解实现函数指针(回调)的方法。但我不太清楚如何将它应用到上面的上下文中。
谢谢!
答案 0 :(得分:0)
关于此,有很多关于SO的帖子。解决方案永远不会令人满意,因为在Java中你不能拥有自由函数:所有函数都是方法(尽管你可以使用静态方法)。对于常规方法,回调必须包含该方法部分关闭的对象(实例)。如果您可以在context
中随心所欲地放置任何内容,那么它可能是可能的。例如,如果调度程序(无论什么对象调用回调)调用cb,如下所示:
cb(context)
然后cb可以是一个函数,它将上下文强制转换为包含指向回调实例的指针的类,然后它可以在该实例上调用该方法:
void MyJavaCallbackFn(MyHandle handle, void* context, MyResult result, ... )
{
MyJavaCallback javaCb = (MyJavaCallback)context;
(javaCb.obj.*->javaCb.method)(javaCb.arg1)
}
为此,MyJavaCallback将是您可以在SWIG .i文件中定义的类,
struct MyJavaCallback
{
MyJavaObj* obj; // MyJavaObj has to be wrapped by SWIG
MyJavaObj::Method* method;
SomeArgClass arg1;
};
您可以通过SWIG .i导出注册函数,该函数接受MyJavaCallback并适当调用MyMethod:
void registerJavaCb(MyJavaCallback context)
{
MyMethod(someHandle, context, MyJavaCallbackFn, ...)
}
这都是伪代码,它是高级别的,但应该给你一般的想法。