diff --git a/build.sh b/build.sh index a67f6a53f..79bcb8c0d 100755 --- a/build.sh +++ b/build.sh @@ -14,8 +14,10 @@ if ( grep "package $AppFullName;" project/src/Globals.java > /dev/null && \ fi MYARCH=linux-x86 +NCPU=4 if uname -s | grep -i "linux" > /dev/null ; then MYARCH=linux-x86 + NCPU=`cat /proc/cpuinfo | grep -c -i processor` fi if uname -s | grep -i "darwin" > /dev/null ; then MYARCH=darwin-x86 @@ -26,7 +28,7 @@ fi rm -r -f project/bin/* # New Android SDK introduced some lame-ass optimizations to the build system which we should take care about -cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build V=1 -j4 && \ +cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build V=1 -j$NCPU && \ { grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \ [ -`which ndk-build | xargs readlink -f | grep '/android-ndk-r[56789]'` != - ] && \ echo Stripping libapplication.so by hand \ diff --git a/project/jni/Android.mk b/project/jni/Android.mk index c818d0eb9..dc5c96f69 100644 --- a/project/jni/Android.mk +++ b/project/jni/Android.mk @@ -17,6 +17,10 @@ $(warning Cannot determine NDK version, assuming NDK r5c - please do not rename NDK_VERSION := r5c endif +ifneq ($(findstring r8b,$(NDK_VERSION))$(findstring r8,$(NDK_VERSION))$(findstring r9,$(NDK_VERSION)),) +#$(info Building with NDK r8b or newer) +NDK_R8B_TOOLCHAIN := 1 +endif ifneq ($(findstring r4-crystax,$(NDK_VERSION)),) #$(info Building with CrystaX r4 toolchain - internal STLPort disabled) CRYSTAX_TOOLCHAIN := 1 diff --git a/project/jni/application/Android.mk b/project/jni/application/Android.mk index 358bcb0ce..5dce979d1 100644 --- a/project/jni/application/Android.mk +++ b/project/jni/application/Android.mk @@ -41,7 +41,9 @@ LOCAL_SHARED_LIBRARIES := sdl-$(SDL_VERSION) $(filter-out $(APP_AVAILABLE_STATIC LOCAL_STATIC_LIBRARIES := $(filter $(APP_AVAILABLE_STATIC_LIBS), $(COMPILED_LIBRARIES)) -#LOCAL_STATIC_LIBRARIES += gnustl_static +APP_STL := gnustl_static + +LOCAL_STATIC_LIBRARIES += gnustl_static LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lz @@ -49,9 +51,13 @@ LOCAL_LDFLAGS := -Lobj/local/armeabi LOCAL_LDFLAGS += $(APPLICATION_ADDITIONAL_LDFLAGS) +#ifneq ($NDK_R8B_TOOLCHAIN,) # They've changed the path, yet again +#LOCAL_C_INCLUDES += $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/include $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/include +#LOCAL_LDLIBS += -L$(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI) -lgnustl_static +#else ifneq ($(NDK_R7_TOOLCHAIN)$(CRYSTAX_R7_TOOLCHAIN),) # NDK r7 broke it even more -LOCAL_C_INCLUDES += $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/include -LOCAL_LDLIBS += -L$(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/libs/$(TARGET_ARCH_ABI) -lgnustl_static +#LOCAL_C_INCLUDES += $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/include +#LOCAL_LDLIBS += -L$(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/libs/$(TARGET_ARCH_ABI) -lgnustl_static # You can have multiple C++ file extensions starting from NDK r7 LOCAL_CPP_EXTENSION := .cpp .cxx .cc else @@ -60,6 +66,7 @@ LOCAL_C_INCLUDES += $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/include LOCAL_LDLIBS += -L$(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/libs/$(TARGET_ARCH_ABI) -lstdc++ endif endif +#endif #LIBS_WITH_LONG_SYMBOLS := $(strip $(shell \ # for f in $(LOCAL_PATH)/../../obj/local/armeabi/*.so ; do \ diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index 413d73933..6db07221c 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -33,7 +33,7 @@ RedefinedKeysScreenKb="0 1 2 3 4 5 6 7 8 9" StartupMenuButtonTimeout=3000 HiddenMenuOptions='OptionalDownloadConfig' FirstStartMenuOptions='' -MultiABI=y +MultiABI=n AppVersionCode=101 AppVersionName="1.01" ResetSdlConfigForThisVersion=n diff --git a/project/jni/application/ballfield/ballfield.cpp b/project/jni/application/ballfield/ballfield.cpp index 4c2e03a11..85b622ee0 100644 --- a/project/jni/application/ballfield/ballfield.cpp +++ b/project/jni/application/ballfield/ballfield.cpp @@ -23,9 +23,11 @@ /*---------------------------------------------------------- Definitions... ----------------------------------------------------------*/ + #define SCREEN_W 320 #define SCREEN_H 240 + #define BALLS 300 #define COLORS 2 @@ -405,49 +407,6 @@ void tiled_back(SDL_Surface *back, SDL_Surface *screen, int xo, int yo) SDL_BlitSurface(back, NULL, screen, &r); } -#pragma GCC push_options -#pragma GCC optimize ("O0") -extern "C" unsigned misaligned_mem_access(unsigned value, unsigned shift); - -unsigned misaligned_mem_access(unsigned value, unsigned shift) -{ - volatile unsigned *iptr = NULL; - volatile char *cptr = NULL; - volatile unsigned ret = 0; - -#if defined(__GNUC__) -# if defined(__i386__) - /* Enable Alignment Checking on x86 */ - __asm__("pushf\norl $0x40000,(%esp)\npopf"); -# elif defined(__x86_64__) - /* Enable Alignment Checking on x86_64 */ - __asm__("pushf\norl $0x40000,(%rsp)\npopf"); -# endif -#endif - - /* malloc() always provides aligned memory */ - cptr = (volatile char *)malloc(sizeof(unsigned) + 10); - - /* Increment the pointer by one, making it misaligned */ - iptr = (volatile unsigned *) (cptr + shift); - - /* Dereference it as an int pointer, causing an unaligned access */ - /* GCC usually tries to optimize this, thus our test succeeds when it should fail, if we remove "volatile" specifiers */ - *iptr = value; - //memcpy( &ret, iptr, sizeof(unsigned) ); - ret = *iptr; - /* - *((volatile char *)(&ret) + 0) = cptr[shift+0]; - *((volatile char *)(&ret) + 1) = cptr[shift+1]; - *((volatile char *)(&ret) + 2) = cptr[shift+2]; - *((volatile char *)(&ret) + 3) = cptr[shift+3]; - */ - free((void *)cptr); - - return ret; -} -#pragma GCC pop_options - /*---------------------------------------------------------- main() ----------------------------------------------------------*/ @@ -604,23 +563,7 @@ int main(int argc, char* argv[]) fps = (float)fps_count * 1000.0 / (tick - fps_start); fps_count = 0; fps_start = tick; - - *((unsigned char *)(&val0) + 0) += 1; - *((unsigned char *)(&val0) + 1) += 1; - *((unsigned char *)(&val0) + 2) += 1; - *((unsigned char *)(&val0) + 3) += 1; } - // MISALIGNED MEMORY ACCESS HERE! However all the devices that I have won't report it and won't send a signal or write to the /proc/kmsg, - // despite the /proc/cpu/alignment flag set. - val1 = misaligned_mem_access(val0, 1); - val2 = misaligned_mem_access(val0, 2); - val3 = misaligned_mem_access(val0, 3); - /* - print_num_hex(screen, font_hex, 0, 40, val0); - print_num_hex(screen, font_hex, 0, 60, val1); - print_num_hex(screen, font_hex, 0, 80, val2); - print_num_hex(screen, font_hex, 0, 100, val3); - */ print_num(screen, font, screen->w-37, screen->h-12, fps); ++fps_count; diff --git a/project/jni/application/setEnvironment.sh b/project/jni/application/setEnvironment.sh index d695a9f97..a58119042 100755 --- a/project/jni/application/setEnvironment.sh +++ b/project/jni/application/setEnvironment.sh @@ -14,13 +14,12 @@ NDK=`readlink -f $NDK` LOCAL_PATH=`dirname $0` LOCAL_PATH=`cd $LOCAL_PATH && pwd` -SCRIPT=setEnvironment-r4b.sh -CRYSTAX_WCHAR= -if [ -n "`echo $NDK | grep 'android-ndk-r[56789]'`" ]; then +if [ -n "`echo $NDK | grep 'android-ndk-r\(8b\|9\)'`" ]; then + SCRIPT=setEnvironment-r8b.sh +elif [ -n "`echo $NDK | grep 'android-ndk-r[5678]'`" ]; then SCRIPT=setEnvironment-r5b.sh -# if [ -n "`echo $NDK | grep 'android-ndk-r[56789]-crystax'`" ]; then -# CRYSTAX_WCHAR=1 -# fi +else + SCRIPT=setEnvironment-r4b.sh fi -env CRYSTAX_WCHAR=$CRYSTAX_WCHAR $LOCAL_PATH/$SCRIPT "$@" +env $LOCAL_PATH/$SCRIPT "$@" diff --git a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c index 8bdbff98d..a50df04db 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c @@ -115,7 +115,9 @@ oldGlState; static inline void beginDrawingTex() { // Save OpenGL state - // TODO: this code does not work on 1.6 emulator, and on some older devices + glGetError(); // Clear error flag + // This code does not work on 1.6 emulator, and on some older devices + // However GLES 1.1 spec defines all theese values, so it's a device fault for not implementing them oldGlState.texture2d = glIsEnabled(GL_TEXTURE_2D); glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldGlState.textureId); glGetFloatv(GL_CURRENT_COLOR, &(oldGlState.color[0])); @@ -126,6 +128,18 @@ static inline void beginDrawingTex() glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &oldGlState.texFilter1); glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &oldGlState.texFilter2); // It's very unlikely that some app will use GL_TEXTURE_CROP_RECT_OES, so just skip it + if( glGetError() != GL_NO_ERROR ) + { + // Make the video somehow work on emulator + oldGlState.texture2d = GL_FALSE; + oldGlState.textureId = 0; + oldGlState.texEnvMode = GL_MODULATE; + oldGlState.blend = GL_FALSE; + oldGlState.blend1 = GL_SRC_ALPHA; + oldGlState.blend2 = GL_ONE_MINUS_SRC_ALPHA; + oldGlState.texFilter1 = GL_NEAREST; + oldGlState.texFilter2 = GL_NEAREST; + } glEnable(GL_TEXTURE_2D); } @@ -133,12 +147,12 @@ static inline void beginDrawingTex() static inline void endDrawingTex() { // Restore OpenGL state - if( oldGlState.texture2d == GL_FALSE) + if( oldGlState.texture2d == GL_FALSE ) glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, oldGlState.textureId); glColor4f(oldGlState.color[0], oldGlState.color[1], oldGlState.color[2], oldGlState.color[3]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, oldGlState.texEnvMode); - if( oldGlState.blend == GL_FALSE) + if( oldGlState.blend == GL_FALSE ) glDisable(GL_BLEND); glBlendFunc(oldGlState.blend1, oldGlState.blend2); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, oldGlState.texFilter1);