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);
}