diff --git a/build.sh b/build.sh index 4e277c6ae..b77424132 100755 --- a/build.sh +++ b/build.sh @@ -101,6 +101,14 @@ cd project && env PATH=$NDKBUILDPATH BUILD_NUM_CPUS=$NCPU nice -n19 ndk-build -j cp jni/application/src/libapplication-armeabi-v7a.so libs/armeabi-v7a/libapplication.so && \ `which ndk-build | sed 's@/ndk-build@@'`/toolchains/arm-linux-androideabi-4.6/prebuilt/$MYARCH/bin/arm-linux-androideabi-strip --strip-unneeded libs/armeabi-v7a/libapplication.so \ || true ; } && \ + { grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \ + grep "MultiABI=" ../AndroidAppSettings.cfg | grep "armeabi-v7a-hard" > /dev/null && \ + echo Stripping libapplication-armeabi-v7a-hard.so by hand && \ + rm obj/local/armeabi-v7a-hard/libapplication.so && \ + cp jni/application/src/libapplication-armeabi-v7a-hard.so obj/local/armeabi-v7a-hard/libapplication.so && \ + cp jni/application/src/libapplication-armeabi-v7a-hard.so libs/armeabi-v7a/libapplication.so && \ + `which ndk-build | sed 's@/ndk-build@@'`/toolchains/arm-linux-androideabi-4.6/prebuilt/$MYARCH/bin/arm-linux-androideabi-strip --strip-unneeded libs/armeabi-v7a/libapplication.so \ + || true ; } && \ { grep "CustomBuildScript=y" ../AndroidAppSettings.cfg > /dev/null && \ grep "MultiABI=" ../AndroidAppSettings.cfg | grep "all\\|mips" > /dev/null && \ echo Stripping libapplication-mips.so by hand && \ diff --git a/project/jni/Application.mk b/project/jni/Application.mk index 68afef587..feab0f1c5 100644 --- a/project/jni/Application.mk +++ b/project/jni/Application.mk @@ -1,9 +1,16 @@ APP_PROJECT_PATH := $(call my-dir)/.. +include jni/Settings.mk + APP_STL := gnustl_static APP_CFLAGS := -O3 -DNDEBUG -g # arm-linux-androideabi-4.4.3 crashes in -O0 mode on SDL sources APP_PLATFORM := android-14 # Android 4.0, it should be backward compatible to previous versions APP_PIE := false # This feature makes executables incompatible to Android API 15 or lower -include jni/Settings.mk - +# Global compiler flags +ifneq ($(filter armeabi-v7a-hard, $(APP_ABI)),) +# Link-time optimization enabled for optimization junkies. -O9001 etc +APP_CFLAGS := -flto +APP_CXXFLAGS := -flto +APP_LDFLAGS := -flto +endif diff --git a/project/jni/application/Android.mk b/project/jni/application/Android.mk index 9d7d9eb6b..a36c37ba5 100644 --- a/project/jni/application/Android.mk +++ b/project/jni/application/Android.mk @@ -95,6 +95,12 @@ $(LOCAL_PATH)/src/libapplication-armeabi-v7a.so: $(SDL_APP_LIB_DEPENDS-armeabi-v cd $(LOCAL_PATH_SDL_APPLICATION)/src && $(PARALLEL_LOCK) && \ ./AndroidBuild.sh armeabi-v7a arm-linux-androideabi && $(PARALLEL_UNLOCK) +obj/local/armeabi-v7a-hard/libapplication.so: $(LOCAL_PATH)/src/libapplication-armeabi-v7a-hard.so + +$(LOCAL_PATH)/src/libapplication-armeabi-v7a-hard.so: $(SDL_APP_LIB_DEPENDS-armeabi-v7a-hard) OVERRIDE_CUSTOM_LIB + cd $(LOCAL_PATH_SDL_APPLICATION)/src && $(PARALLEL_LOCK) && \ + ./AndroidBuild.sh armeabi-v7a-hard arm-linux-androideabi && $(PARALLEL_UNLOCK) + obj/local/mips/libapplication.so: $(LOCAL_PATH)/src/libapplication-mips.so $(LOCAL_PATH)/src/libapplication-mips.so: $(SDL_APP_LIB_DEPENDS-mips) OVERRIDE_CUSTOM_LIB diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index 164794512..5d669f616 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -208,7 +208,7 @@ FirstStartMenuOptions='SettingsMenu.DummyMenu' # Enable multi-ABI binary, with hardware FPU support - it will also work on old devices, # but .apk size is 2x bigger (y) / (n) / (x86) / (all) -MultiABI='armeabi-v7a' +MultiABI='armeabi-v7a-hard' # Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower AppMinimumRAM=0 diff --git a/project/jni/application/setEnvironment-armeabi-v7a-hard.sh b/project/jni/application/setEnvironment-armeabi-v7a-hard.sh new file mode 100755 index 000000000..787ae6d02 --- /dev/null +++ b/project/jni/application/setEnvironment-armeabi-v7a-hard.sh @@ -0,0 +1,109 @@ +#!/bin/sh + +IFS=' +' + +MYARCH=linux-x86 +if uname -s | grep -i "linux" > /dev/null ; then + MYARCH=linux-x86 +fi +if uname -s | grep -i "darwin" > /dev/null ; then + MYARCH=darwin-x86 +fi +if uname -s | grep -i "windows" > /dev/null ; then + MYARCH=windows-x86 +fi + +NDK=`which ndk-build` +NDK=`dirname $NDK` +NDK=`readlink -f $NDK` + +grep "64.bit" "$NDK/RELEASE.TXT" >/dev/null 2>&1 && MYARCH="${MYARCH}_64" + +#echo NDK $NDK +GCCPREFIX=arm-linux-androideabi +[ -z "$GCCVER" ] && GCCVER=4.6 +[ -z "$PLATFORMVER" ] && PLATFORMVER=android-14 +LOCAL_PATH=`dirname $0` +if which realpath > /dev/null ; then + LOCAL_PATH=`realpath $LOCAL_PATH` +else + LOCAL_PATH=`cd $LOCAL_PATH && pwd` +fi +ARCH=armeabi-v7a-hard + +APP_MODULES=`grep 'APP_MODULES [:][=]' $LOCAL_PATH/../Settings.mk | sed 's@.*[=]\(.*\)@\1@'` +APP_AVAILABLE_STATIC_LIBS=`grep 'APP_AVAILABLE_STATIC_LIBS [:][=]' $LOCAL_PATH/../Settings.mk | sed 's@.*[=]\(.*\)@\1@'` +APP_SHARED_LIBS=$( +echo $APP_MODULES | xargs -n 1 echo | while read LIB ; do + STATIC=`echo $APP_AVAILABLE_STATIC_LIBS application sdl_main stlport stdout-test | grep "\\\\b$LIB\\\\b"` + if [ -n "$STATIC" ] ; then true + else + echo $LIB + fi +done +) + + +MISSING_INCLUDE= +MISSING_LIB= + +CFLAGS="\ +-fpic -ffunction-sections -funwind-tables -fstack-protector \ +-no-canonical-prefixes -march=armv7-a -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -flto \ +-mfpu=vfpv3-d16 -mthumb -O2 -g -DNDEBUG \ +-fomit-frame-pointer -fno-strict-aliasing -finline-limit=300 \ +-DANDROID -Wall -Wno-unused -Wa,--noexecstack -Wformat -Werror=format-security \ +-isystem$NDK/platforms/$PLATFORMVER/arch-arm/usr/include \ +-isystem$NDK/sources/cxx-stl/gnu-libstdc++/$GCCVER/include \ +-isystem$NDK/sources/cxx-stl/gnu-libstdc++/$GCCVER/libs/$ARCH/include \ +-isystem$NDK/sources/cxx-stl/gnu-libstdc++/$GCCVER/include/backward \ +-isystem$LOCAL_PATH/../sdl-1.2/include \ +`echo $APP_MODULES | sed \"s@\([-a-zA-Z0-9_.]\+\)@-isystem$LOCAL_PATH/../\1/include@g\"` \ +$MISSING_INCLUDE $CFLAGS" + +if [ -z "$SHARED_LIBRARY_NAME" ]; then + SHARED_LIBRARY_NAME=libapplication.so +fi +UNRESOLVED="-Wl,--no-undefined" +SHARED="-shared -Wl,-soname,$SHARED_LIBRARY_NAME" +if [ -n "$BUILD_EXECUTABLE" ]; then + SHARED="-Wl,--gc-sections -Wl,-z,nocopyreloc" +fi +if [ -n "$NO_SHARED_LIBS" ]; then + APP_SHARED_LIBS= +fi +if [ -n "$ALLOW_UNRESOLVED_SYMBOLS" ]; then + UNRESOLVED= +fi + +LDFLAGS="\ +$SHARED \ +--sysroot=$NDK/platforms/$PLATFORMVER/arch-arm \ +-L$LOCAL_PATH/../../obj/local/$ARCH \ +`echo $APP_SHARED_LIBS | sed \"s@\([-a-zA-Z0-9_.]\+\)@$LOCAL_PATH/../../obj/local/$ARCH/lib\1.so@g\"` \ +-L$NDK/platforms/$PLATFORMVER/arch-arm/usr/lib \ +-lc -lGLESv1_CM -ldl -llog -lz \ +-Wl,--no-warn-mismatch -lm_hard -flto \ +-L$NDK/sources/cxx-stl/gnu-libstdc++/$GCCVER/libs/$ARCH \ +-lgnustl_static \ +-no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 $UNRESOLVED -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now \ +-lsupc++ \ +$MISSING_LIB $LDFLAGS" + +#echo env CFLAGS=\""$CFLAGS"\" LDFLAGS=\""$LDFLAGS"\" "$@" + +env PATH=$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin:$LOCAL_PATH:$PATH \ +CFLAGS="$CFLAGS" \ +CXXFLAGS="$CXXFLAGS $CFLAGS -frtti -fexceptions" \ +LDFLAGS="$LDFLAGS" \ +CC="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-gcc" \ +CXX="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-g++" \ +RANLIB="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-ranlib" \ +LD="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-g++" \ +AR="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-ar" \ +CPP="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-cpp $CFLAGS" \ +NM="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-nm" \ +AS="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-as" \ +STRIP="$NDK/toolchains/$GCCPREFIX-$GCCVER/prebuilt/$MYARCH/bin/$GCCPREFIX-strip" \ +"$@" diff --git a/project/jni/boost/Android.mk b/project/jni/boost/Android.mk index 7c19292ee..8d706a306 100644 --- a/project/jni/boost/Android.mk +++ b/project/jni/boost/Android.mk @@ -3,6 +3,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) ifeq ($(TARGET_ARCH),arm) +ifeq ($(filter armeabi-v7a-hard, $(APP_ABI)),) # Pre-compiled lib disabled for armhf ABI LOCAL_MODULE := $(notdir $(LOCAL_PATH)) ifneq ($(LOCAL_MODULE),boost) @@ -12,6 +13,7 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_SRC_FILES := lib/arm-linux-androideabi-4.6/lib$(LOCAL_MODULE).a include $(PREBUILT_STATIC_LIBRARY) +endif endif endif # $(TARGET_ARCH),arm diff --git a/project/jni/ffmpeg/Android.mk b/project/jni/ffmpeg/Android.mk index 6edbf6389..814f1c858 100644 --- a/project/jni/ffmpeg/Android.mk +++ b/project/jni/ffmpeg/Android.mk @@ -6,6 +6,7 @@ LOCAL_PATH:=$(call my-dir) #FFMPEG_REBUILD_FROM_SOURCE:=yes ifeq ($(TARGET_ARCH),arm) +ifeq ($(filter armeabi-v7a-hard, $(APP_ABI)),) # Pre-compiled lib disabled for armhf ABI ifneq ($(FFMPEG_REBUILD_FROM_SOURCE),yes) @@ -631,4 +632,5 @@ endif #CONFIG_FFMPEG_COMPILE_TOOLS endif # notdir $(LOCAL_PATH)),ffmpeg endif # FFMPEG_REBUILD_FROM_SOURCE),yes +endif # $(filter armeabi-v7a-hard, $(APP_ABI)) endif # $(TARGET_ARCH),arm diff --git a/project/jni/iconv/Android.mk b/project/jni/iconv/Android.mk index 2bcda5b00..a92c1a60a 100644 --- a/project/jni/iconv/Android.mk +++ b/project/jni/iconv/Android.mk @@ -2,6 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +ifeq ($(filter armeabi-v7a-hard, $(APP_ABI)),) # Pre-compiled lib disabled for armhf ABI + LOCAL_MODULE := $(notdir $(LOCAL_PATH)) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include @@ -9,3 +11,5 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so include $(PREBUILT_SHARED_LIBRARY) + +endif diff --git a/project/jni/icuuc/Android.mk b/project/jni/icuuc/Android.mk index 89dc92c34..00ca61864 100644 --- a/project/jni/icuuc/Android.mk +++ b/project/jni/icuuc/Android.mk @@ -2,6 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +ifeq ($(filter armeabi-v7a-hard, $(APP_ABI)),) # Pre-compiled lib disabled for armhf ABI + LOCAL_MODULE := $(notdir $(LOCAL_PATH)) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include @@ -13,3 +15,5 @@ obj/local/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).a: $(LOCAL_PATH)/$(LOCAL_SRC_FIL cp -f $< $@ include $(PREBUILT_STATIC_LIBRARY) + +endif diff --git a/project/jni/sdl-1.2/Android.mk b/project/jni/sdl-1.2/Android.mk index 4e2695117..45d328164 100644 --- a/project/jni/sdl-1.2/Android.mk +++ b/project/jni/sdl-1.2/Android.mk @@ -17,6 +17,9 @@ LOCAL_CFLAGS := -O3 \ -DSDL_VIDEO_RENDER_RESIZE=$(SDL_VIDEO_RENDER_RESIZE) \ $(SDL_ADDITIONAL_CFLAGS) +ifeq ($(TARGET_ARCH_ABI),x86) +LOCAL_CFLAGS += -DSDL_ASSEMBLY_ROUTINES=1 # Enable MMX optimizations +endif SDL_SRCS := \ src/*.c \ diff --git a/project/jni/sdl-1.2/include/SDL_config_android.h b/project/jni/sdl-1.2/include/SDL_config_android.h index 315f1fc73..d1c56f25f 100644 --- a/project/jni/sdl-1.2/include/SDL_config_android.h +++ b/project/jni/sdl-1.2/include/SDL_config_android.h @@ -162,7 +162,7 @@ #define HAVE_SYSCONF 1 #undef HAVE_SYSCTLBYNAME #undef SDL_ALTIVEC_BLITTERS -#define SDL_ASSEMBLY_ROUTINES 1 // There is no assembly code for Arm CPU yet +/* #define SDL_ASSEMBLY_ROUTINES 1 */ // There is no assembly code for ARM CPU yet, and it fails when compiling for armhf #define HAVE_GCC_ATOMICS 1 #endif /* _SDL_config_minimal_h */