デスクトップおよび iOS アプリケーションで使用される C++ ライブラリを Android に移植する作業を行っています。私は SWIG を使用して JNI コードを作成しており、必要な場所への道のりは約 90% です。私が残した唯一の問題は、C++ ライブラリからコールバック関数をラップすることです。
メインの Device クラスには、次のものがあります。
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++ ライブラリによって作成されたランダムなバックグラウンド スレッドでも発生することに注意してください。