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