Android SDL2 App黑屏然后退出

时间:2015-01-08 02:25:31

标签: android c++ android-ndk logcat sdl-2

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

如果我在我的主要开始时添加了对SDL_ShowSimpleMessageBox的调用,则没有任何反应(我已经知道它还没有为Android实现 - grrr),但如果我发表评论 - 我的主要代码,ndk-build抱怨它已经丢失了,所以它肯定被包含在构建中,但似乎没有被调用。

我已按照README-android.txt中的步骤进行操作。在过去2个月解决问题大约200个小时后,我最终制作了一个apk。我做了以下修复可能会破坏什么?

第一个问题是NDK-BUILD无法找到SDL_config.h,因为README-android.txt中的步骤#2中的说明有误。修复了重建目录或编辑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_listva_start)。包括<SDL.h>而不是修复此内容。

Fith问题是ant build failing at [aapt] Generating resource IDs。我在Android SDK Manager中通过删除build-tools verion 21.1.1并安装版本20来修复此问题。

这是我第一次在这里寻求帮助,因为我绝望了。我是一位经验丰富的C ++编码员,但在Java方面却是一个完整的新手。我在eclipse中为Windows SDL2使用C ++,我完全从命令行构建了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)

2 个答案:

答案 0 :(得分:1)

我发现了这个问题。随意拍我的手腕。

我总是编码,假设我可以用8位对齐指针寻址内存。在过去的25年里,这对我有用,直到现在。我的代码在针对Android时失败,因为它使用的CPU拒绝使用8位对齐的指针来寻址内存。因此,只要我沿着字节对齐的黄油移动指针并将指针强制转换为对象并引用该指针,BAM,android就会悄然退出应用程序。

现在的问题是如何解决这个问题?它记录了我在过去2个月里遇到的所有问题和解决方案,所以必须对某人有用吗?

答案 1 :(得分:0)

我有类似的问题,但原因却完全不同。 启动应用程序后,它仍保持黑色,似乎在半秒后最小化。切换到应用程序也会将其再次最小化。

事实证明,Makei语法突出显示在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