Fixed Android library stripping on some Windows configurations.

Perform Android build as out-of-source on Windows to match the Unix behavior and allow the same commands to be used.
Finalized the Android build documentation.
Removed the old Android native code build path using ndk-build.
Fixed post processing intermediate rendertargets not matching the rendertarget format.
This commit is contained in:
Lasse Öörni 2013-07-13 18:47:36 +00:00
Родитель c37695b16a
Коммит dac3f4e0a8
8 изменённых файлов: 44 добавлений и 360 удалений

Просмотреть файл

@ -495,11 +495,6 @@ endif()
# see if we have path to Android NDK
__INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
# Urho3D: allow also ANDROID_NDK_ROOT
if( NOT ANDROID_NDK )
__INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK_ROOT )
endif()
if( NOT ANDROID_NDK )
# see if we have path to Android standalone toolchain
__INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN OBSOLETE_ANDROID_NDK_TOOLCHAIN_ROOT OBSOLETE_ENV_ANDROID_NDK_TOOLCHAIN_ROOT )
@ -1563,9 +1558,7 @@ if(NOT _CMAKE_IN_TRY_COMPILE)
else()
set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
endif()
# Urho3D: differentiate between non-stripped (local) and stripped (installed) library folder
set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/local/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for local android libs" )
set( INSTALLED_LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for installed/stripped android libs" )
set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" )
endif()
# set these global flags for cmake client scripts to change behavior

Просмотреть файл

@ -1,312 +0,0 @@
# AngelScript library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/AngelScript
include $(CLEAR_VARS)
LOCAL_MODULE := AngelScript
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/source/*.cpp) \
$(LOCAL_PATH)/source/as_callfunc_arm_gcc.S)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
include $(BUILD_STATIC_LIBRARY)
# Bullet library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/Bullet
include $(CLEAR_VARS)
LOCAL_MODULE := Bullet
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/BulletCollision/BroadphaseCollision/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletCollision/CollisionDispatch/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletCollision/CollisionShapes/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletCollision/Gimpact/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletCollision/NarrowPhaseCollision/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletDynamics/Character/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletDynamics/ConstraintSolver/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletDynamics/Dynamics/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletDynamics/Vehicle/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/BulletSoftBody/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/LinearMath/*.cpp))
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/src
include $(BUILD_STATIC_LIBRARY)
# Detour library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/Detour
include $(CLEAR_VARS)
LOCAL_MODULE := Detour
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/Source/*.cpp))
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/Include
include $(BUILD_STATIC_LIBRARY)
# FreeType library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/FreeType
include $(CLEAR_VARS)
LOCAL_MODULE := FreeType
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(LOCAL_PATH)/src/autofit/autofit.c \
$(LOCAL_PATH)/src/base/ftbase.c \
$(LOCAL_PATH)/src/base/ftbbox.c \
$(LOCAL_PATH)/src/base/ftbitmap.c \
$(LOCAL_PATH)/src/base/ftfstype.c \
$(LOCAL_PATH)/src/base/ftgasp.c \
$(LOCAL_PATH)/src/base/ftglyph.c \
$(LOCAL_PATH)/src/base/ftgxval.c \
$(LOCAL_PATH)/src/base/ftinit.c \
$(LOCAL_PATH)/src/base/ftlcdfil.c \
$(LOCAL_PATH)/src/base/ftmm.c \
$(LOCAL_PATH)/src/base/ftotval.c \
$(LOCAL_PATH)/src/base/ftpatent.c \
$(LOCAL_PATH)/src/base/ftpfr.c \
$(LOCAL_PATH)/src/base/ftstroke.c \
$(LOCAL_PATH)/src/base/ftsynth.c \
$(LOCAL_PATH)/src/base/ftsystem.c \
$(LOCAL_PATH)/src/base/fttype1.c \
$(LOCAL_PATH)/src/base/ftwinfnt.c \
$(LOCAL_PATH)/src/bdf/bdf.c \
$(LOCAL_PATH)/src/cache/ftccache.c \
$(LOCAL_PATH)/src/cff/cff.c \
$(LOCAL_PATH)/src/cid/type1cid.c \
$(LOCAL_PATH)/src/gzip/ftgzip.c \
$(LOCAL_PATH)/src/lzw/ftlzw.c \
$(LOCAL_PATH)/src/pcf/pcf.c \
$(LOCAL_PATH)/src/pfr/pfr.c \
$(LOCAL_PATH)/src/psaux/psaux.c \
$(LOCAL_PATH)/src/pshinter/pshinter.c \
$(LOCAL_PATH)/src/psnames/psmodule.c \
$(LOCAL_PATH)/src/raster/raster.c \
$(LOCAL_PATH)/src/sfnt/sfnt.c \
$(LOCAL_PATH)/src/smooth/smooth.c \
$(LOCAL_PATH)/src/truetype/truetype.c \
$(LOCAL_PATH)/src/type1/type1.c \
$(LOCAL_PATH)/src/type42/type42.c \
$(LOCAL_PATH)/src/winfonts/winfnt.c)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_CFLAGS += -DFT2_BUILD_LIBRARY
include $(BUILD_STATIC_LIBRARY)
# kNet library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/kNet
include $(CLEAR_VARS)
LOCAL_MODULE := kNet
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/unix/*.cpp))
include $(BUILD_STATIC_LIBRARY)
# PugiXml library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/PugiXml
include $(CLEAR_VARS)
LOCAL_MODULE := PugiXml
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/*.cpp))
include $(BUILD_STATIC_LIBRARY)
# Recast library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/Recast
include $(CLEAR_VARS)
LOCAL_MODULE := Recast
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/Source/*.cpp))
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/Include
include $(BUILD_STATIC_LIBRARY)
# SDL library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/SDL
include $(CLEAR_VARS)
LOCAL_MODULE := SDL
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \
$(LOCAL_PATH)/src/atomic/SDL_atomic.c \
$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \
$(wildcard $(LOCAL_PATH)/src/core/android/*.cpp) \
$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
$(wildcard $(LOCAL_PATH)/src/events/*.c) \
$(wildcard $(LOCAL_PATH)/src/file/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \
$(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/android/*.c))
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
include $(BUILD_STATIC_LIBRARY)
# StanHull library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/StanHull
include $(CLEAR_VARS)
LOCAL_MODULE := StanHull
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/*.cpp))
include $(BUILD_STATIC_LIBRARY)
# STB library
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/STB
include $(CLEAR_VARS)
LOCAL_MODULE := STB
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/*.c))
include $(BUILD_STATIC_LIBRARY)
# JO JPEG
LOCAL_PATH = $(ROOT_PATH)/ThirdParty/JO
include $(CLEAR_VARS)
LOCAL_MODULE := JO
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/*.cpp))
include $(BUILD_STATIC_LIBRARY)
# Urho3D executable
LOCAL_PATH = $(ROOT_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := Urho3D
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/Engine/Audio \
$(LOCAL_PATH)/Engine/Container \
$(LOCAL_PATH)/Engine/Core \
$(LOCAL_PATH)/Engine/Engine \
$(LOCAL_PATH)/Engine/Graphics \
$(LOCAL_PATH)/Engine/Input \
$(LOCAL_PATH)/Engine/IO \
$(LOCAL_PATH)/Engine/Math \
$(LOCAL_PATH)/Engine/Navigation \
$(LOCAL_PATH)/Engine/Network \
$(LOCAL_PATH)/Engine/Physics \
$(LOCAL_PATH)/Engine/Resource \
$(LOCAL_PATH)/Engine/Scene \
$(LOCAL_PATH)/Engine/Script \
$(LOCAL_PATH)/Engine/UI \
$(LOCAL_PATH)/ThirdParty/AngelScript/include \
$(LOCAL_PATH)/ThirdParty/Bullet/src \
$(LOCAL_PATH)/ThirdParty/Detour/Include \
$(LOCAL_PATH)/ThirdParty/FreeType/include \
$(LOCAL_PATH)/ThirdParty/kNet/include \
$(LOCAL_PATH)/ThirdParty/PugiXml/src \
$(LOCAL_PATH)/ThirdParty/Recast/Include \
$(LOCAL_PATH)/ThirdParty/SDL/include \
$(LOCAL_PATH)/ThirdParty/StanHull \
$(LOCAL_PATH)/ThirdParty/STB \
$(LOCAL_PATH)/ThirdParty/JO
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/Engine/Audio/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Container/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Core/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Engine/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Graphics/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Graphics/OpenGL/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Input/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/IO/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Math/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Navigation/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Network/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Physics/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Resource/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Scene/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/Script/*.cpp) \
$(wildcard $(LOCAL_PATH)/Engine/UI/*.cpp) \
$(wildcard $(LOCAL_PATH)/Urho3D/*.cpp) \
$(wildcard $(LOCAL_PATH)/ThirdParty/SDL/src/main/android/*.cpp))
LOCAL_CPPFLAGS += -DENABLE_LOGGING
LOCAL_STATIC_LIBRARIES := AngelScript Bullet Detour FreeType kNet PugiXml Recast SDL StanHull STB JO
LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)

Просмотреть файл

@ -1,4 +0,0 @@
ROOT_PATH := $(call my-dir)/../..
APP_ABI := armeabi armeabi-v7a
APP_STL := gnustl_static
APP_CPPFLAGS += -fexceptions -frtti -Wno-invalid-offsetof -DUSE_OPENGL -DENABLE_PROFILING

Просмотреть файл

@ -199,7 +199,9 @@ macro (setup_main_executable)
else ()
add_library (${TARGET_NAME} SHARED ${SOURCE_FILES})
setup_target ()
install (TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${INSTALLED_LIBRARY_OUTPUT_PATH})
# Strip the output shared library
get_target_property (EXECUTABLE_NAME ${TARGET_NAME} LOCATION)
add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} ${EXECUTABLE_NAME})
endif ()
# Define a custom target to check for resource modification

Просмотреть файл

@ -54,27 +54,27 @@ To run from Xcode on Mac OS X, edit the Product Scheme to set "Run" setting to e
\section Building_Android Android build process
First, if you are building under Windows platform, copy Bin/Data and Bin/CoreData directories to the Android/assets directory (you can use the provided batch file CopyData.bat). This step is not necessary for non-Windows platform because the build script uses symbolic links for platforms that support it. Next, execute the following commands in the Android directory:
First, if you are building under Windows platform, copy Bin/Data and Bin/CoreData directories to the Android/assets directory (you can use the provided batch file CopyData.bat). This step is not necessary for non-Windows platform because the build script uses symbolic links for platforms that support it.
- android update project -p . -t 1 (only needed on the first time, replace '-t 1' with desired target-id)
- ndk-build
Set the ANDROID_NDK environment variable to point to your Android NDK. On Windows, ensure that make.exe from the Android NDK is included in the path and is executable from the command line.
On Windows, execute cmake_android.bat. On OS X or Linux, execute cmake_gcc.sh (the ANDROID_NDK environment variable distinguishes from a normal desktop build.) Then go to the Android directory and execute the following commands
- android update project -p . -t 1 (only needed on the first time,
replace '-t 1' with desired target-id)
- make -j8 (replace '-j8' with the number of logical CPU cores of the
host/build system)
- ant debug
Note that ndk-build builds Urho3D twice, once without hardware floating point instructions, and once with them. After the commands finish successfully, the APK should have been generated to the Android/bin directory, from where it can be installed on a device or an emulator.
After the commands finish successfully, the APK should have been generated to the Android/bin directory, from where it can be installed on a device or an emulator. The command "ant installd" can be used for this.
For a release build, use the "ant release" command instead of "ant debug" and follow the Android SDK instructions on how to sign your APK properly.
By default the Android package for Urho3D is com.googlecode.urho3d. For a real application you must replace this with your own package name. The Urho3D activity subclasses the SDLActivity from org.libsdl.app package, whose name (or the JNI code from SDL library) does not have to be changed.
There is also a CMake-based, work-in-progress method to build the Urho3D native code. To use, first set "ANDROID_NDK" environment variable to point to where your NDK is being installed, then run cmake_android.bat or cmake_gcc.sh, then run make in the Android directory. After the native code build is finished, proceed to ant debug like above. In Linux, typically:
Note that the native code is built by default for armeabi-v7a ABI. To make your program compatible also with old Android devices, build also an armeabi version by executing the CMake batch file again with the parameter -DANDROID_ABI=armeabi added, then execute make again in the Android directory.
- ./cmake_gcc.sh
- cd Android
- android update project -p . -t 1
- make -j8 install/strip (replace '-j8' with the number of logical CPU cores of the host/build system)
- ant debug && ant installd (for deploying the debug apk)
You can also build and deploy using Eclipse IDE with ADT plugin. To do that, after setting the "ANDROID_NDK" environment variable then run cmake_eclipse.sh. Import "Existing Android Code into Workspace" from the CMake generated Eclipse's project found in the Android directory. Switch Eclipse IDE to use Java Perspective. Update project properties to choose the desired Android API target and that's it. Just choose "Run" to let ADT automatically build and deploy the application to Android (virtual) device.
You can also build and deploy using Eclipse IDE with ADT plugin. To do that, after setting the ANDROID_NDK environment variable then run cmake_eclipse.sh. Import "Existing Android Code into Workspace" from the CMake generated Eclipse's project found in the Android directory. Switch Eclipse IDE to use Java Perspective. Update project properties to choose the desired Android API target and that's it. Just choose "Run" to let ADT automatically build and deploy the application to Android (virtual) device.
\section Building_Ios iOS build process

Просмотреть файл

@ -1541,7 +1541,9 @@ void View::AllocateScreenBuffers()
if (deferred_ && !renderTarget_ && graphics_->GetMultiSample() > 1)
neededBuffers = 1;
unsigned format = Graphics::GetRGBFormat();
// Follow final rendertarget format, or use RGB to match the backbuffer format
unsigned format = renderTarget_ ? renderTarget_->GetParentTexture()->GetFormat() : Graphics::GetRGBFormat();
#ifdef USE_OPENGL
if (deferred_)
format = Graphics::GetRGBAFormat();

Просмотреть файл

@ -200,18 +200,25 @@ Android build process
First, if you are building under Windows platform, copy Bin/Data and Bin/CoreData
directories to the Android/assets directory (you can use the provided batch file
CopyData.bat). This step is not necessary for non-Windows platform because the
build script uses symbolic links for platforms that support it. Next, execute the
following commands in the Android directory:
build script uses symbolic links for platforms that support it.
Set the ANDROID_NDK environment variable to point to your Android NDK. On Windows,
ensure that make.exe from the Android NDK is included in the path and is executable
from the command line.
On Windows, execute cmake_android.bat. On OS X or Linux, execute cmake_gcc.sh (the
ANDROID_NDK environment variable distinguishes from a normal desktop build.) Then
go to the Android directory and execute the following commands
- android update project -p . -t 1 (only needed on the first time,
replace '-t 1' with desired target-id)
- ndk-build
- make -j8 (replace '-j8' with the number of logical CPU cores of the
host/build system)
- ant debug
Note that ndk-build builds Urho3D twice, once without hardware floating point
instructions, and once with them. After the commands finish successfully, the
APK should have been generated to the Android/bin directory, from where it can
be installed on a device or an emulator.
After the commands finish successfully, the APK should have been generated to the
Android/bin directory, from where it can be installed on a device or an emulator.
The command "ant installd" can be used for this.
For a release build, use the "ant release" command instead of "ant debug" and
follow the Android SDK instructions on how to sign your APK properly.
@ -221,21 +228,13 @@ application you must replace this with your own package name. The Urho3D
activity subclasses the SDLActivity from org.libsdl.app package, whose name
(or the JNI code from SDL library) does not have to be changed.
There is also a CMake-based, work-in-progress method to build the Urho3D native
code. To use, first set "ANDROID_NDK" environment variable to point to where your
NDK is being installed, then run cmake_android.bat or cmake_gcc.sh, then run make
in the Android directory. After the native code build is finished, proceed to ant
debug like above. In Linux, typically:
- ./cmake_gcc.sh
- cd Android
- android update project -p . -t 1
- make -j8 install/strip (replace '-j8' with the number of logical CPU cores of
the host/build system)
- ant debug && ant installd (for deploying the debug apk)
Note that the native code is built by default for armeabi-v7a ABI. To make your
program compatible also with old Android devices, build also an armeabi version
by executing the CMake batch file again with the parameter -DANDROID_ABI=armeabi
added, then execute make again in the Android directory.
You can also build and deploy using Eclipse IDE with ADT plugin. To do that, after
setting the "ANDROID_NDK" environment variable then run cmake_eclipse.sh. Import
setting the ANDROID_NDK environment variable then run cmake_eclipse.sh. Import
"Existing Android Code into Workspace" from the CMake generated Eclipse's project
found in the Android directory. Switch Eclipse IDE to use Java Perspective. Update
project properties to choose the desired Android API target and that's it. Just

Просмотреть файл

@ -1,3 +1,7 @@
@del /F CMakeCache.txt
@rd /S /Q CMakeFiles
cmake -G "Unix Makefiles" -DANDROID=1 -DCMAKE_TOOLCHAIN_FILE=Android/android.toolchain.cmake -DLIBRARY_OUTPUT_PATH_ROOT=Android -DCMAKE_BUILD_TYPE=Release %*
@cd Android
@del /F CMakeCache.txt
@rd /S /Q CMakeFiles
cmake -G "Unix Makefiles" -DANDROID=1 -DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake -DLIBRARY_OUTPUT_PATH_ROOT=. -DCMAKE_BUILD_TYPE=Release .. %*
@cd ..