4

我正在将桌面和 iOS 应用程序中使用的 C++ 库移植到 Android。我正在使用 SWIG 创建 JNI 代码,并且我已经完成了大约 90% 的工作。我剩下的唯一问题是包装 C++ 库中的回调函数。

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

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

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

// 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,我如何从回调中获取,DeviceReceive从 C++DeviceReceive结构创建 java 类,然后调用 Java 回调处理程序。请注意,回调也发生在 C++ 库创建的随机后台线程上。

4

0 回答 0