LINUX.ORG.RU

SDL + Android

 ,


0

1

Хочу попробовать использовать SDL для разработки Android-приложения. В принципе разобрался со сборкой и нормально собираю APK.

Для теста написал простое приложение, которое после инициализации тупо крутит event loop в ожидании события SDL_QUIT (после чего вызывается SQL_Quit и функция main выходит). В свободное время экран просто заполняется белым цветом.

Всё работает, но возникла проблема с выходом. Я получаю белый экран, но приложение банально не реагирует на кнопку «назад». Единственный способ выйти - свернуть его и смахнуть в сторону в списке недавних приложений.

Окей. Гуглим, как в SDL определить нажатие кнопки «Назад». Узнаём, что в данном случае приходит событие SDL_KEYDOWN с определённым кодом. Обрабатываю это событие так же как SDL_QUIT - выхожу из event loop.

Теперь приложение нормально закрывается при нажатии на кнопку «Назад». Однако после этого оно отказывается запускаться, пока не смахнёшь его из списка недавних приложений.

Наконец, можно добавить перед return 0 в код main вызов exit(0). Тогда приложение нормально закрывается и нормально стартует заново после этого.

Но, насколько я понимаю, это очень криво с точки зрения Android. К тому же анимация закрытия не отрабатывает - приложение закрывается мгновенно.

Как правильно реализовывать выход из приложения на SDL на Android?

UPD: В некоторых туториалах советуют добавить ручной вызов finish для activity в конец метода run класса SDLMain (точнее не прямой вызов, а различными ухищрениями выполнить вызов finish в UI-потоке). Так вот - это не помогает. Точно также получаю результат, что приложение закрывается, а потом не открывается, пока его вручную не прибить. Да и вроде как в текущей версии кода Java есть ожидание завершения потока SDL и вызов после этого finish. То есть проблема не в том, что Activity не завершается, а в том что приложение после этого попадает в странное состояние, в котором оно продолжает висеть в памяти, но больше не способно запуститься.

★★★★★

В обёртке main в файле src/main/android/SDL_android_main.c, которую ты компилируешь и линкуешь в свою so-шку, есть такое:

    ...
    /* Run the application. */

    status = SDL_main(argc, argv);

    /* Release the arguments. */

    for (i = 0; i < argc; ++i) {
        SDL_free(argv[i]);
    }

    /* Do not issue an exit or the whole application will terminate instead of just the SDL thread */
    /* exit(status); */

    return status;
    ...

Теперь приложение нормально закрывается при нажатии на кнопку «Назад». Однако после этого оно отказывается запускаться, пока не смахнёшь его из списка недавних приложений.

У меня вроде была похожая проблема. Насколько я помню, помимо выхода из event loop нужно вызывать ещё SDL_Quit() перед return.

Но, насколько я понимаю, это очень криво с точки зрения Android.

Для нативных приложений это норм, иначе библиотека остаётся висеть в памяти и при следующем запуске оно либо не запустится, либо запустится с различными лагами, по-крайней мере так было у меня.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

SDL_Quit я вызываю перед выходом из main, но это не помогает.

Кстати, столкнулся ещё с одной проблемой - если заблокировать экран или свернуть приложение, а потом вновь к нему вернуться, получается только чёрный экран, который никак ни на что не реагирует, пока его не прибьёшь средствами ОС.

И если exit(0) в конце main как-то помогает решить проблему с выходом (хоть и не рекомендуется самими авторами SDL), то эту проблему таким образом не решить.

KivApple ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.