Fixed SDL compilation, added redefined printf to print to logcat

This commit is contained in:
pelya
2011-02-07 09:25:57 +00:00
parent 7b4c12cdc3
commit 877d015c96
6 changed files with 54 additions and 29 deletions

View File

@@ -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 -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog
LOCAL_CFLAGS += -D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog -Dprintf=__SDL_android_printf
LOCAL_CFLAGS += $(APPLICATION_ADDITIONAL_CFLAGS)
@@ -51,28 +51,30 @@ LOCAL_LDFLAGS := -Lobj/local/armeabi
LOCAL_LDFLAGS += $(APPLICATION_ADDITIONAL_LDFLAGS)
LIBS_WITH_LONG_SYMBOLS := $(strip $(shell \
for f in $(LOCAL_PATH)/../../obj/local/armeabi/*.so ; do \
if echo $$f | grep "libapplication[.]so" > /dev/null ; then \
continue ; \
fi ; \
if [ -e "$$f" ] ; then \
if nm -g $$f | cut -c 12- | egrep '.{128}' > /dev/null ; then \
echo $$f | grep -o 'lib[^/]*[.]so' ; \
fi ; \
fi ; \
done \
) )
# Disabled for now 'till I not confirmed it
ifneq "$(LIBS_WITH_LONG_SYMBOLS)" ""
$(foreach F, $(LIBS_WITH_LONG_SYMBOLS), \
$(info Library $(F): abusing symbol names are: \
$(shell nm -g $(LOCAL_PATH)/../../obj/local/armeabi/$(F) | cut -c 12- | egrep '.{128}' ) ) \
$(info Library $(F) contains symbol names longer than 128 bytes, \
YOUR CODE WILL DEADLOCK WITHOUT ANY WARNING when you'll access such function - \
please make this library static to avoid problems. ) )
$(error Detected libraries with too long symbol names. Remove all files under project/obj/local/armeabi, make these libs static, and recompile)
endif
#LIBS_WITH_LONG_SYMBOLS := $(strip $(shell \
# for f in $(LOCAL_PATH)/../../obj/local/armeabi/*.so ; do \
# if echo $$f | grep "libapplication[.]so" > /dev/null ; then \
# continue ; \
# fi ; \
# if [ -e "$$f" ] ; then \
# if nm -g $$f | cut -c 12- | egrep '.{128}' > /dev/null ; then \
# echo $$f | grep -o 'lib[^/]*[.]so' ; \
# fi ; \
# fi ; \
# done \
#) )
#ifneq "$(LIBS_WITH_LONG_SYMBOLS)" ""
#$(foreach F, $(LIBS_WITH_LONG_SYMBOLS), \
#$(info Library $(F): abusing symbol names are: \
#$(shell nm -g $(LOCAL_PATH)/../../obj/local/armeabi/$(F) | cut -c 12- | egrep '.{128}' ) ) \
#$(info Library $(F) contains symbol names longer than 128 bytes, \
#YOUR CODE WILL DEADLOCK WITHOUT ANY WARNING when you'll access such function - \
#please make this library static to avoid problems. ) )
#$(error Detected libraries with too long symbol names. Remove all files under project/obj/local/armeabi, make these libs static, and recompile)
#endif
APP_LIB_DEPENDS := $(foreach LIB, $(LOCAL_SHARED_LIBRARIES), $(abspath $(LOCAL_PATH)/../../obj/local/armeabi/lib$(LIB).so))
APP_LIB_DEPENDS += $(foreach LIB, $(LOCAL_STATIC_LIBRARIES), $(abspath $(LOCAL_PATH)/../../obj/local/armeabi/lib$(LIB).a))

View File

@@ -47,7 +47,8 @@ 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 -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog \
-Wa,--noexecstack -DNDEBUG -g \
-D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog -Dprintf=__SDL_android_printf \
-I$LOCAL_PATH/../sdl-1.2/include $STL_INCLUDE \
`echo $APP_MODULES | sed \"s@\([-a-zA-Z0-9_.]\+\)@-I$LOCAL_PATH/../\1/include@g\"`"

View File

@@ -50,7 +50,8 @@ 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 -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog -DNDEBUG -O2 -g \
-DANDROID -D__sF=__SDL_fake_stdout -Dcout=__SDL_fake_cout -Dcerr=__SDL_fake_cerr -Dclog=__SDL_fake_clog -Dprintf=__SDL_android_printf \
-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 \

View File

@@ -38,6 +38,7 @@ SDL_SRCS := \
src/audio/android/*.c \
src/cdrom/dummy/*.c \
src/video/android/*.c \
src/video/android/*.cpp \
src/haptic/dummy/*.c \
src/loadso/dlopen/*.c \
src/atomic/dummy/*.c \

View File

@@ -8,14 +8,13 @@ it is heavily dependent on NDK internals and is not portable in any way.
#define _SDL_fake_stdout_h
#include <stdio.h>
#include <android/log.h>
#include <iostream>
extern "C" FILE __SDL_fake_stdout[];
FILE __SDL_fake_stdout[3];
extern "C" void SDL_ANDROID_initFakeStdout();
void SDL_ANDROID_initFakeStdout()
extern "C" void SDL_ANDROID_initFakeStdout()
{
FILE * ff = NULL;
__SDL_fake_stdout[0] = * fopen("/dev/null", "r");
@@ -23,13 +22,34 @@ void SDL_ANDROID_initFakeStdout()
__SDL_fake_stdout[2] = * fopen("/dev/null", "w");
}
int __SDL_android_printf(const char * fmt, ...)
{
int return_value;
char buff[1024];
va_list ap;
va_start(ap, fmt);
/*
int characters = vfprintf(stdout, fmt, ap); // get buffer size
if(characters<0) return;
char* buff = new char[characters+1];
return_value = vsprintf(buff, fmt, ap);
*/
return_value = vsnprintf(buff, sizeof(buff), fmt, ap);
va_end(ap);
__android_log_print(ANDROID_LOG_INFO, "libSDL", buff);
//delete buff;
return return_value;
}
/* 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
namespace std {
class _android_debugbuf: public std::streambuf
{
public:
_android_debugbuf()
@@ -94,7 +114,6 @@ void outputchar(char c)
};
namespace std {
ostream __SDL_fake_cout(new _android_debugbuf());
ostream __SDL_fake_cerr(new _android_debugbuf());
ostream __SDL_fake_clog(new _android_debugbuf());