From e07c5cfd149b886de265830ac6844db47341ead1 Mon Sep 17 00:00:00 2001 From: pelya Date: Fri, 4 Feb 2011 14:47:18 +0000 Subject: [PATCH] Added fake cin/cout/cerr to prevent application crashing on tablets --- project/jni/application/Android.mk | 2 +- project/jni/application/setEnvironment-r4b.sh | 2 +- project/jni/application/setEnvironment-r5b.sh | 2 +- project/jni/application/src | 2 +- .../src/video/android/SDL_fake_stdout.c | 1 - .../src/video/android/SDL_fake_stdout.cpp | 1 + .../src/video/android/SDL_androidinput.c | 5 +- .../src/video/android/SDL_fake_stdout.c | 23 ---- .../src/video/android/SDL_fake_stdout.cpp | 103 ++++++++++++++++++ 9 files changed, 111 insertions(+), 30 deletions(-) delete mode 120000 project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.c create mode 120000 project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.cpp delete mode 100644 project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.c create mode 100644 project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.cpp diff --git a/project/jni/application/Android.mk b/project/jni/application/Android.mk index 8301b357b..4e0f1afc0 100644 --- a/project/jni/application/Android.mk +++ b/project/jni/application/Android.mk @@ -25,7 +25,7 @@ LOCAL_C_INCLUDES += $(foreach D, $(APP_SUBDIRS), $(LOCAL_PATH)/$(D)) \ $(LOCAL_PATH)/../sdl-$(SDL_VERSION)/include \ $(foreach L, $(COMPILED_LIBRARIES), $(LOCAL_PATH)/../$(L)/include) -LOCAL_CFLAGS += -D__sF=__SDL_fake_stdout +LOCAL_CFLAGS += -D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog LOCAL_CFLAGS += $(APPLICATION_ADDITIONAL_CFLAGS) diff --git a/project/jni/application/setEnvironment-r4b.sh b/project/jni/application/setEnvironment-r4b.sh index 61a87cb4f..c161b213f 100755 --- a/project/jni/application/setEnvironment-r4b.sh +++ b/project/jni/application/setEnvironment-r4b.sh @@ -47,7 +47,7 @@ CFLAGS="-I$NDK/build/platforms/$PLATFORMVER/arch-arm/usr/include \ -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID \ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -O2 \ -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 \ --Wa,--noexecstack -DNDEBUG -g -D__sF=__SDL_fake_stdout \ +-Wa,--noexecstack -DNDEBUG -g -D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog \ -I$LOCAL_PATH/../sdl-1.2/include $STL_INCLUDE \ `echo $APP_MODULES | sed \"s@\([-a-zA-Z0-9_.]\+\)@-I$LOCAL_PATH/../\1/include@g\"`" diff --git a/project/jni/application/setEnvironment-r5b.sh b/project/jni/application/setEnvironment-r5b.sh index d1ef08f4b..b5a6a7687 100755 --- a/project/jni/application/setEnvironment-r5b.sh +++ b/project/jni/application/setEnvironment-r5b.sh @@ -50,7 +50,7 @@ CFLAGS="\ -fpic -ffunction-sections -funwind-tables -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi \ -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 \ -I$NDK/platforms/$PLATFORMVER/arch-arm/usr/include -Wa,--noexecstack \ --DANDROID -D__sF=__SDL_fake_stdout -DNDEBUG -O2 -g \ +-DANDROID -D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog -DNDEBUG -O2 -g \ -I$NDK/sources/cxx-stl/gnu-libstdc++/include \ -I$NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include \ -I$LOCAL_PATH/../sdl-1.2/include \ diff --git a/project/jni/application/src b/project/jni/application/src index 550b7b622..92362c4db 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -openttd \ No newline at end of file +ufoai \ No newline at end of file diff --git a/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.c b/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.c deleted file mode 120000 index f63ebc09f..000000000 --- a/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.c +++ /dev/null @@ -1 +0,0 @@ -../../../../sdl-1.3/src/video/android/SDL_fake_stdout.c \ No newline at end of file diff --git a/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.cpp b/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.cpp new file mode 120000 index 000000000..5f8039724 --- /dev/null +++ b/project/jni/sdl-1.2/src/video/android/SDL_fake_stdout.cpp @@ -0,0 +1 @@ +../../../../sdl-1.3/src/video/android/SDL_fake_stdout.cpp \ No newline at end of file diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c index df5fa3f7d..53f009ee9 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c @@ -57,8 +57,9 @@ static inline SDL_scancode TranslateKey(int scancode) static int isTrackballUsed = 0; static int isMouseUsed = 0; -enum { RIGHT_CLICK_NONE = 0, RIGHT_CLICK_WITH_MULTITOUCH = 1, RIGHT_CLICK_WITH_PRESSURE = 2, RIGHT_CLICK_WITH_KEY = 3 }; -enum { LEFT_CLICK_NORMAL = 0, LEFT_CLICK_NEAR_CURSOR = 1, LEFT_CLICK_WITH_MULTITOUCH = 2, LEFT_CLICK_WITH_PRESSURE = 3, LEFT_CLICK_WITH_KEY = 4 }; +enum { RIGHT_CLICK_NONE = 0, RIGHT_CLICK_WITH_MULTITOUCH = 1, RIGHT_CLICK_WITH_PRESSURE = 2, RIGHT_CLICK_WITH_KEY = 3, RIGHT_CLICK_WITH_TIMEOUT = 4 }; +enum { LEFT_CLICK_NORMAL = 0, LEFT_CLICK_NEAR_CURSOR = 1, LEFT_CLICK_WITH_MULTITOUCH = 2, LEFT_CLICK_WITH_PRESSURE = 3, + LEFT_CLICK_WITH_KEY = 4, LEFT_CLICK_WITH_TIMEOUT = 5, LEFT_CLICK_WITH_TAP = 6, LEFT_CLICK_WITH_TAP_OR_TIMEOUT = 7 }; static int leftClickMethod = LEFT_CLICK_NORMAL; static int rightClickMethod = RIGHT_CLICK_NONE; static int leftClickKey = KEYCODE_DPAD_CENTER; diff --git a/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.c b/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.c deleted file mode 100644 index 619dbce6a..000000000 --- a/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.c +++ /dev/null @@ -1,23 +0,0 @@ -/* -Writing to stdout will crash your program on some particular Android tablets. -Although this is the device bug I've put a workaround here, -it is heavily dependent on NDK internals and is not portable in any way. -*/ - -#ifndef _SDL_fake_stdout_h -#define _SDL_fake_stdout_h -#include - -extern FILE __SDL_fake_stdout[]; - -FILE __SDL_fake_stdout[3]; - -void SDL_ANDROID_initFakeStdout() -{ - FILE * ff = NULL; - __SDL_fake_stdout[0] = * fopen("/dev/null", "r"); - __SDL_fake_stdout[1] = * fopen("/dev/null", "w"); - __SDL_fake_stdout[2] = * fopen("/dev/null", "w"); -} - -#endif diff --git a/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.cpp b/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.cpp new file mode 100644 index 000000000..80552e9fd --- /dev/null +++ b/project/jni/sdl-1.3/src/video/android/SDL_fake_stdout.cpp @@ -0,0 +1,103 @@ +/* +Writing to stdout will crash your program on some particular Android tablets. +Although this is the device bug I've put a workaround here, +it is heavily dependent on NDK internals and is not portable in any way. +*/ + +#ifndef _SDL_fake_stdout_h +#define _SDL_fake_stdout_h +#include +#include + +extern "C" FILE __SDL_fake_stdout[]; + +FILE __SDL_fake_stdout[3]; + +extern "C" void SDL_ANDROID_initFakeStdout(); + +void SDL_ANDROID_initFakeStdout() +{ + FILE * ff = NULL; + __SDL_fake_stdout[0] = * fopen("/dev/null", "r"); + __SDL_fake_stdout[1] = * fopen("/dev/null", "w"); + __SDL_fake_stdout[2] = * fopen("/dev/null", "w"); +} + +/* Outputting anything to cout/cerr WILL CRASH YOUR PROGRAM on specific devices - + x5a/x6d Android 2.1 tablet, and some other tablets, + however the same code runs on my HTC Evo without problem. + So I've just disabled cin/cout/cerr altogether. +*/ + +class _android_debugbuf: public streambuf +{ + public: + _android_debugbuf() + { + pos = 0; + buf[0] = 0; + } + + protected: + + +virtual int overflow(int c = EOF) +{ + if (EOF == c) + { + return '\0'; // returning EOF indicates an error + } + else + { + outputchar(c); + return c; + } +}; + + +// we don’t do input so always return EOF +virtual int uflow() {return EOF;} + +// we don’t do input so always return 0 chars read +virtual int xsgetn(char *, int) {return 0;} + +// Calls outputchar() for each character. +virtual int xsputn(const char *s, int n) +{ + for (int i = 0; i < n; ++i) + { + outputchar(s[i]); + } + return n;// we always process all of the chars +}; + +private: + +// the buffer +char buf[256]; +int pos; + +void outputchar(char c) +{ + // TODO: mutex + if( pos >= sizeof(buf)-1 || c == '\n' || c == '\r' || c == 0 ) + { + buf[pos] = 0; + __android_log_print(ANDROID_LOG_INFO, "libSDL", "%s", buf); + pos = 0; + buf[pos] = 0; + return; + }; + buf[pos] = c; + pos++; +}; + +}; + +namespace std { +ostream __SDL_fake_cout(new _android_debugbuf()); +ostream __SDL_fake_cerr(new _android_debugbuf()); +ostream __SDL_fake_clog(new _android_debugbuf()); +} + +#endif