2013-04-18 70 views
2

我有一個經過C-回調從擴展功能的果醬擴展和示例應用程序,那麼會發生什麼情況是,每當擴展試圖調用的函數,它與神祕的消息崩潰:應用程序 - >在回調調用擴展崩潰

異常類型:EXC_BAD_ACCESS(SIGSEGV) 異常代碼:KERN_INVALID_ADDRESS在0x00000008 墜毀主題:0

雖然之前我調用函數我打印出來的地址,它是不同的,似乎有效。那麼是果醬限制還是我做錯了什麼?

p.s:值得注意的是我用clang(不是gcc)編譯了我的marmalade擴展,一切正常,但是回調......儘管之前我使用了默認的marmalade 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); 
} 

回答

1

那麼,顯然沒有辦法直接傳遞從應用程序到擴展函數指針,所以果醬提供自己的回調系統,應該利用它來使事情發揮作用。