Android SDL2 App 黑屏然后退出

Android SDL2 App black screen then exits

本文关键字:然后 退出 SDL2 App Android      更新时间:2023-10-16

我有一个在Windows中运行的SDL2演示,但是当我将此代码移植到Android时,完成的应用程序将显示黑屏几秒钟,然后悄悄退出(没有错误,什么都没有),而不是在游戏循环中显示漂亮的测试图形。

如果我在 main 的开头添加对 SDL_ShowSimpleMessageBox 的调用,什么都不会发生(我后来了解到它还没有为 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。通过向Application.mk添加APP_PLATFORM := android-9来修复。

第三个问题是NDK-BUILD无法识别C++11,所以我在Application.mk中添加了APP_CPPFLAGS += -std=c++11

第四个问题是NDK-BUILD找不到#include <cstdarg>(用于va_listva_start)。包括<SDL.h>反而解决了这个问题。

第五个问题是ant构建failing at [aapt] Generating resource IDs。我在Android SDK管理器中通过删除构建工具版本21.1.1并安装版本20来解决此问题。

这是我第一次在这里发帖寻求帮助,因为我很绝望。我是一名资深的C++程序员,但在 Java 方面完全是新手。我在 Windows SDL2 的 eclipse 中使用C++,并且完全从命令行构建了 apk。

在几种不同的设备上试用。查看日志猫,有一个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 时失败,因为它使用的任何 CPU 都拒绝使用 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