Swig:如何将具有指针函数的方法包装成指针函数?

时间:2014-02-27 17:38:36

标签: java c++ swig

我在C / C ++项目中有这个:

typedef void (*MyCallback) (MyHandle handle, void* context, MyResult result, ... );
int MyMethod(MyHandle handle, void* context, MyCallback cb);

使用 Swig ,我需要为MyMethod创建一个包装器。

我在文档中阅读this section,了解实现函数指针(回调)的方法。但我不太清楚如何将它应用到上面的上下文中。

谢谢!

1 个答案:

答案 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, ...)
}

这都是伪代码,它是高级别的,但应该给你一般的想法。