확장 기능에서 함수에 C- 콜백을 전달하는 마멀레이드 확장 프로그램 및 샘플 앱이 있는데 확장 프로그램이 함수 호출을 시도 할 때마다 신비한 메시지와 충돌합니다 :콜백 호출시 앱 -> 확장 프로그램 충돌
예외 유형 : EXC_BAD_ACCESS (SIGSEGV) 예외 코드 : KERN_INVALID_ADDRESS 0x00000008 추락 한 스레드에서 : 0
내가 함수를 호출하기 전에 나는 그것이 주소의 그것은 다르다 유효한 것 같다 인쇄, 비록. 그래서 마멀레이드의 제한이나 내가 뭔가 잘못하고 있는거야?
p.s : 알아 두어야 할 점 clang (gcc 아님)으로 내 마멀레이드 확장을 컴파일하면 모든 것이 잘 작동하지만 콜백 (callbacks ...)하기 전에 기본 마멀레이드 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);
}