приложение — & gt; сбой расширения при вызове обратного вызова

У меня есть расширение Marmalade и пример приложения, которое передает C-callback функции из расширения, так что, когда расширение пытается вызвать функцию, происходит сбой с загадочным сообщением:

Тип исключения: EXC_BAD_ACCESS (SIGSEGV)
Коды исключений: KERN_INVALID_ADDRESS в 0x00000008
Разрушенная нить: 0

Хотя, прежде чем вызывать функцию, я печатаю ее адрес, он отличается и кажется действительным. Так это мармеладные ограничения или я что-то не так делаю?

p.s: стоит заметить, я компилирую свое расширение мармелада с помощью 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);
}

2

Решение

Ну, очевидно, нет способа передать указатель на функцию из приложения в расширение напрямую, поэтому Marmalade предлагает свою собственную систему обратных вызовов, которую следует использовать, чтобы заставить вещи работать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]