2

拡張機能から関数に C コールバックを渡す Marmalade 拡張機能とサンプル アプリがあるため、拡張機能が関数を呼び出そうとするたびに、不思議なメッセージでクラッシュします。

例外の種類: EXC_BAD_ACCESS (SIGSEGV) 例外コード: KERN_INVALID_ADDRESS at 0x00000008 クラッシュしたスレッド: 0

ただし、関数を呼び出す前に、そのアドレスを出力しますが、それは異なり、有効に見えます。それで、それはマーマレードの制限ですか、それとも私は何か間違ったことをしていますか?

PS:マーマレード拡張機能をclang(gccではない)でコンパイルすると、すべて正常に動作しますが、コールバック...以前はデフォルトのマーマレードgccを使用していましたが、まったく同じ問題がありました。

サンプルアプリ:

class CDemoApp {
public:
    static CDemoApp* getInstance() {
        static CDemoApp instance;
        return &instance;
    }

    void setup()
    {
        app = CreateApp();
        window = CreateWindow();
        app->AddWindow(window);
        view = CreateView("canvas");

        button = CreateButton();

        button->SetEventHandler("click", (void*)NULL, CDemoApp::onButton1Click);

        view->AddChild(button);
        window->SetChild(view);

        app->ShowWindow(window);
    }

    void run() {
        app->Run();
    }

    static void onSDKInit(const char* err, void* context) {
        printf("Done.\n");
    }

    static bool onButton1Click(void* data, CButton* button) {
        if(!s3eMyExtDidInitialize()) {
            // crash happens here.
            // extension doesn't perform any ops, just calls the callback with dummy arguments
            s3eMyExtDoInitialize(APP_ID, APP_SECRET, CDemoApp::onSDKInit, NULL);
        }

        return true;
    }

private:
    CDemoApp() {};

private:
    CAppPtr app;
    CWindowPtr window;
    CViewPtr view;
    CButtonPtr button;
};

// Main entry point for the application
int main()
{
    if(!s3eMyExtAvailable())
    {
        s3eDebugErrorShow(S3E_MESSAGE_CONTINUE, "My extension is not found");
        return 0;
    }

    CDemoApp::getInstance()->setup();
    CDemoApp::getInstance()->run();

    return 0;
}

拡張機能s3eMyExtDoInitializeから公開された関数は次のようになります。

typedef void (*my_callback)(const char* error, void* context);
void s3eMyExtDoInitialize_platform(const char* appId, const char* appSecret, my_callback callback, void* context) { 
    callback(NULL, NULL); 
}
4

1 に答える 1

1

どうやら関数ポインタをアプリから拡張機能に直接渡す方法はないようです。そのため、Marmalade は独自のコールバック システムを提供しています。

于 2013-04-20T15:13:10.410 に答える