用SWIG包装C ++函数指针回调

时间:2012-12-21 17:41:29

标签: callback java-native-interface swig

我正在努力将桌面和iOS应用程序中使用的C ++库移植到Android。我正在使用SWIG来创建JNI代码,而且我大约有90%的路由到了我需要的位置。我剩下的唯一问题是从C ++库中包装回调函数。

在我的主要Device类中,我有以下内容:

class Device
{
public:
    void set_receive_callback(ReceiveFunctonPointer func, void *userdata);
};

回调函数和struct数据具有以下签名:

// enum wrapped by SWIG
enum CommandType {
    ...
};

// enum wrapped by SWIG
enum ValueFormat {
    ...
};

// Value map wrapped by SWIG
typedef std::map<int, std::string> ValueMap;

// struct to be passed back.  Already wrapped into Java class by SWiG
struct DeviceReceive {
    void *userdata;
    CommandType command;
    std::string messageId;
    std::string value;
    ValueFormat format;
    ValueMap value_map;
    Device *device;
};

// the callback function signature
typedef void (*ReceiveCallback)(DeviceReceive data);

根据我的阅读,我需要在Java中创建某种类型的DeviceCallback接口来使用。这应该是简单的事情:

package my.sdk;
import my.sdk.DeviceReceive;

public interface DeviceCallback {
    void handleCallback(DeviceReceive data);
}

我的问题是,使用SWIG,如何从回调中获取,从C ++ DeviceReceive结构创建java DeviceReceive类,然后调用Java回调处理程序。请注意,回调也发生在C ++库创建的随机后台线程上。

0 个答案:

没有答案