我正在将桌面和 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++ 库创建的随机后台线程上。