У меня есть работающая демонстрация SDL2, работающая в Windows, но когда я портирую этот код на Android, готовое приложение будет отображать черный экран в течение нескольких секунд, а затем тихо выйдет (без ошибок, ничего), вместо того, чтобы показывать симпатичную тестовую графику в игре -loop.
Если я добавлю звонок в SDL_ShowSimpleMessageBox
в начале моего main ничего не происходит (с тех пор я узнал, что он еще не реализован для Android — grrr), но если я закомментирую свой основной код, ndk-build жалуется, что он отсутствует, поэтому он, безусловно, включается в сборка, но, кажется, не вызывается.
Я следовал за шагами в README-android.txt
, После примерно 200 часов решения проблем за последние 2 месяца я в конечном итоге выпустил apk. Следующие исправления, которые я сделал, возможно, что-то сломали?
Первая проблема — NDK-BUILD не удается найти SDL_config.h
из-за инструкций на шаге № 2 в README-android.txt
быть неправым. Исправлена реструктуризация каталогов или редактирование путей в Android.mk
,
Вторая проблема — NDK-BUILD не может найти EGL/eglplatform.h
, Исправлено добавлением APP_PLATFORM := android-9
в Application.mk
,
Третья проблема — NDK-BUILD не распознает C ++ 11, поэтому я добавил APP_CPPFLAGS += -std=c++11
в Application.mk
,
Четвертая проблема — NDK-BUILD не находит #include <cstdarg>
(используется для va_list
а также va_start
). В том числе <SDL.h>
вместо этого исправили это.
Проблема с ant
строить failing at [aapt] Generating resource IDs
, Я исправил это в Android SDK Manager, удалив build-tools verion 21.1.1 и установив вместо него версию 20.
Это первый раз, когда я написал здесь о помощи, потому что я в отчаянии. Я ветеран C ++, но я новичок в том, что касается Java. Я использую C ++ в Eclipse для Windows SDL2, и я полностью создал apk из командной строки.
Пробовал на нескольких разных устройствах. Глядя на LogCat, есть signal 7 SIGBUS
ошибка:
V/SurfaceView( 3497): Layout: x=0 y=0 w=1280 h=720, frame=Rect(0, 0 - 1280, 720)
F/libc ( 3497): Fatal signal 7 (SIGBUS) at 0x00000000 (code=128)
I/ActivityManager( 162): Displayed org.libsdl.app/.SDLActivity: +416ms
V/SDL ( 3497): onWindowFocusChanged(): true
W/InputManagerService( 162): Starting input on non-focused client
com.android.internal.view.IInputMethodClient$StubProxy@410b72d8 (uid=10021 pid=331)
Я нашел проблему. Не стесняйтесь бить мои запястья.
Я всегда придерживался предположения, что могу обращаться к памяти с помощью 8-битных выровненных указателей. Это работало для меня в течение последних 25 лет, до сих пор. Мой код дает сбой, когда он нацелен на Android, потому что независимо от того, какой процессор он использует, он не обращается к памяти с помощью 8-битных указателей. Поэтому, как только я перемещаю указатель вдоль выровненного по байту сливочного масла и приводим этот указатель к объекту и ссылаюсь на этот указатель, BAM, android тихо выходит из приложения.
Теперь вопрос, что делать с этим вопросом? В нем записываются все проблемы и решения, с которыми я боролся за последние 2 месяца, так что, должно быть, кому-нибудь пригодится?
У меня была похожая проблема, но совсем другая причина.
После запуска приложения оно оставалось черным и, по-видимому, уменьшалось само по себе через полсекунды. Переключение на приложение также минимизировало его снова.
Оказывается, подсветка синтаксиса Makefile прослушивается в SciTE (а также, похоже, и в Stackoverflow), так что примерно так:
# LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
$(PROJECT_PATH)/main.cpp
был фактически закомментирован полностью, но не показан как таковой. В результате я полагаю, что основная процедура из SDL используется вместо моей.
Эта проблема может быть обнаружена, глядя в скомпилированный файл с nm -C android-project/obj/local/arm64-v8a/libmain.so
и заметив, что он почти не содержит функций:
00000000000004c4 t atexit
00000000000004ac t __atexit_handler_wrapper
0000000000011008 A __bss_end__
0000000000011008 A _bss_end__
0000000000011008 A __bss_start
0000000000011008 A __bss_start__
U __cxa_atexit@@LIBC
U __cxa_finalize@@LIBC
0000000000010d70 t $d
0000000000011000 d $d
0000000000011000 d __dso_handle
0000000000010d80 a _DYNAMIC
0000000000011008 A _edata
0000000000011008 A _end
0000000000011008 A __end__
0000000000010ff8 a _GLOBAL_OFFSET_TABLE_
00000000000004a0 t __on_dlclose
00000000000004ac t $x
00000000000004a0 t $x
0000000000000480 t $x