4

デスクトップおよび 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++ ライブラリによって作成されたランダムなバックグラウンド スレッドでも発生することに注意してください。

4

0 に答える 0