Merge change Ifb9dee6f into eclair
* changes: Add support for armeabi-v7a to the NDK.
This commit is contained in:
@@ -262,7 +262,7 @@ NDK_APP_VARS_REQUIRED := APP_MODULES APP_PROJECT_PATH
|
|||||||
|
|
||||||
# the list of variables that *may* be defined in Application.mk files
|
# the list of variables that *may* be defined in Application.mk files
|
||||||
NDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS \
|
NDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS \
|
||||||
APP_PLATFORM APP_BUILD_SCRIPT
|
APP_PLATFORM APP_BUILD_SCRIPT APP_ABI
|
||||||
|
|
||||||
# the list of all variables that may appear in an Application.mk file
|
# the list of all variables that may appear in an Application.mk file
|
||||||
NDK_APP_VARS := $(NDK_APP_VARS_REQUIRED) $(NDK_APP_VARS_OPTIONAL)
|
NDK_APP_VARS := $(NDK_APP_VARS_REQUIRED) $(NDK_APP_VARS_OPTIONAL)
|
||||||
|
|||||||
@@ -83,13 +83,31 @@ $(foreach _config_mk,$(TOOLCHAIN_CONFIGS),\
|
|||||||
$(eval include $(BUILD_SYSTEM)/add-toolchain.mk)\
|
$(eval include $(BUILD_SYSTEM)/add-toolchain.mk)\
|
||||||
)
|
)
|
||||||
|
|
||||||
#$(info ALL_TOOLCHAINS=$(ALL_TOOLCHAINS))
|
|
||||||
NDK_TARGET_TOOLCHAIN := $(firstword $(NDK_ALL_TOOLCHAINS))
|
|
||||||
$(call ndk_log, Default toolchain is $(NDK_TARGET_TOOLCHAIN))
|
|
||||||
|
|
||||||
NDK_ALL_TOOLCHAINS := $(call uniq,$(NDK_ALL_TOOLCHAINS))
|
NDK_ALL_TOOLCHAINS := $(call uniq,$(NDK_ALL_TOOLCHAINS))
|
||||||
NDK_ALL_ABIS := $(call uniq,$(NDK_ALL_ABIS))
|
NDK_ALL_ABIS := $(call uniq,$(NDK_ALL_ABIS))
|
||||||
|
|
||||||
|
# The default toolchain is now arm-eabi-4.4.0, however its
|
||||||
|
# C++ compiler is a tad bit more pedantic with certain
|
||||||
|
# constructs (e.g. templates) so allow users to switch back
|
||||||
|
# to the old 4.2.1 instead if they really want to.
|
||||||
|
#
|
||||||
|
# NOTE: you won't get armeabi-v7a support though !
|
||||||
|
#
|
||||||
|
NDK_TOOLCHAIN := $(strip $(NDK_TOOLCHAIN))
|
||||||
|
ifndef NDK_TOOLCHAIN
|
||||||
|
NDK_TARGET_TOOLCHAIN := arm-eabi-4.4.0
|
||||||
|
$(call ndk_log, Default toolchain is $(NDK_TARGET_TOOLCHAIN))
|
||||||
|
else
|
||||||
|
# check that the toolchain name is supported
|
||||||
|
$(if $(filter-out $(NDK_ALL_TOOLCHAINS),$(NDK_TOOLCHAIN)),\
|
||||||
|
$(call __ndk_info,NDK_TOOLCHAIN is defined to the unsupported value $(NDK_TOOLCHAIN)) \
|
||||||
|
$(call __ndk_info,Please use one of the following values: $(NDK_ALL_TOOLCHAINS))\
|
||||||
|
$(call __ndk_error,Aborting)\
|
||||||
|
,)
|
||||||
|
NDK_TARGET_TOOLCHAIN=$(NDK_TOOLCHAIN)
|
||||||
|
$(call ndk_log, Using specific toolchain $(NDK_TARGET_TOOLCHAIN))
|
||||||
|
endif
|
||||||
|
|
||||||
$(call ndk_log, This NDK supports the following toolchains and target ABIs:)
|
$(call ndk_log, This NDK supports the following toolchains and target ABIs:)
|
||||||
$(foreach tc,$(NDK_ALL_TOOLCHAINS),\
|
$(foreach tc,$(NDK_ALL_TOOLCHAINS),\
|
||||||
$(call ndk_log, $(space)$(space)$(tc): $(NDK_TOOLCHAIN.$(tc).abis))\
|
$(call ndk_log, $(space)$(space)$(tc): $(NDK_TOOLCHAIN.$(tc).abis))\
|
||||||
|
|||||||
28
ndk/build/core/setup-abi.mk
Normal file
28
ndk/build/core/setup-abi.mk
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Copyright (C) 2009 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# this file is included multiple times by build/core/setup-app.mk
|
||||||
|
#
|
||||||
|
|
||||||
|
$(call ndk_log,Building application '$(NDK_APP_NAME)' for ABI '$(TARGET_ARCH_ABI)')
|
||||||
|
|
||||||
|
TARGET_ARCH := arm
|
||||||
|
|
||||||
|
TARGET_OUT := $(NDK_APP_OUT)/$(_app)/$(TARGET_ARCH_ABI)
|
||||||
|
TARGET_OBJS := $(TARGET_OUT)/objs
|
||||||
|
|
||||||
|
TARGET_GDB_SETUP := $(TARGET_OUT)/setup.gdb
|
||||||
|
|
||||||
|
include $(BUILD_SYSTEM)/setup-toolchain.mk
|
||||||
@@ -21,21 +21,6 @@ $(call assert-defined,_app)
|
|||||||
|
|
||||||
_map := NDK_APP.$(_app)
|
_map := NDK_APP.$(_app)
|
||||||
|
|
||||||
# which platform/abi/toolchain are we going to use?
|
|
||||||
TARGET_PLATFORM := $(call get,$(_map),APP_PLATFORM)
|
|
||||||
TARGET_ARCH_ABI := arm
|
|
||||||
TARGET_ARCH := arm
|
|
||||||
TARGET_TOOLCHAIN := $(NDK_TARGET_TOOLCHAIN)
|
|
||||||
|
|
||||||
# the location of generated files for this app
|
|
||||||
HOST_OUT := $(NDK_APP_OUT)/$(_app)/$(HOST_TAG)
|
|
||||||
HOST_OBJS := $(HOST_OUT)/objs
|
|
||||||
|
|
||||||
TARGET_OUT := $(NDK_APP_OUT)/$(_app)/$(TARGET_ABI)
|
|
||||||
TARGET_OBJS := $(TARGET_OUT)/objs
|
|
||||||
|
|
||||||
TARGET_GDB_SETUP := $(TARGET_OUT)/setup.gdb
|
|
||||||
|
|
||||||
# ok, let's parse all Android.mk source files in order to build
|
# ok, let's parse all Android.mk source files in order to build
|
||||||
# the modules for this app.
|
# the modules for this app.
|
||||||
#
|
#
|
||||||
@@ -62,4 +47,33 @@ endif
|
|||||||
ndk-app-$(_app): $(NDK_APP_MODULES)
|
ndk-app-$(_app): $(NDK_APP_MODULES)
|
||||||
all: ndk-app-$(_app)
|
all: ndk-app-$(_app)
|
||||||
|
|
||||||
include $(BUILD_SYSTEM)/setup-toolchain.mk
|
# which platform/abi/toolchain are we going to use?
|
||||||
|
TARGET_PLATFORM := $(call get,$(_map),APP_PLATFORM)
|
||||||
|
|
||||||
|
# the location of generated files for this app
|
||||||
|
HOST_OUT := $(NDK_APP_OUT)/$(_app)/$(HOST_TAG)
|
||||||
|
HOST_OBJS := $(HOST_OUT)/objs
|
||||||
|
|
||||||
|
# the target to use
|
||||||
|
TARGET_TOOLCHAIN := $(NDK_TARGET_TOOLCHAIN)
|
||||||
|
|
||||||
|
APP_ABI := $(strip $(APP_ABI))
|
||||||
|
ifndef APP_ABI
|
||||||
|
# the default ABI for now is armeabi
|
||||||
|
APP_ABI := armeabi
|
||||||
|
endif
|
||||||
|
|
||||||
|
# check the target ABIs for this application
|
||||||
|
_bad_abis = $(strip $(filter-out $(NDK_ALL_ABIS),$(APP_ABI)))
|
||||||
|
ifneq ($(_bad_abis),)
|
||||||
|
$(info _bad_abis = '$(_bad_abis)')
|
||||||
|
$(call __ndk_info,NDK Application '$(_app)' targets unknown ABI(s): $(_bad_abis))
|
||||||
|
$(call __ndk_info,Please fix the APP_ABI definition in $(NDK_APP_APPLICATION_MK))
|
||||||
|
$(call __ndk_error,Aborting)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(foreach _abi,$(APP_ABI),\
|
||||||
|
$(eval TARGET_ARCH_ABI := $(_abi))\
|
||||||
|
$(eval include $(BUILD_SYSTEM)/setup-abi.mk) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -13,13 +13,21 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
# this file is included repeatedly from build/core/main.mk and is used
|
# this file is included repeatedly from build/core/setup-abi.mk and is used
|
||||||
# to setup the target toolchain for a given platform/abi combination.
|
# to setup the target toolchain for a given platform/abi combination.
|
||||||
#
|
#
|
||||||
|
|
||||||
$(call assert-defined,TARGET_TOOLCHAIN TARGET_PLATFORM TARGET_ARCH TARGET_ARCH_ABI)
|
$(call assert-defined,TARGET_TOOLCHAIN TARGET_PLATFORM TARGET_ARCH TARGET_ARCH_ABI)
|
||||||
$(call assert-defined,NDK_APPS)
|
$(call assert-defined,NDK_APPS)
|
||||||
|
|
||||||
|
# Check that the toolchain supports the current ABI
|
||||||
|
$(if $(filter-out $(NDK_TOOLCHAIN.$(NDK_TARGET_TOOLCHAIN).abis),$(TARGET_ARCH_ABI)),\
|
||||||
|
$(call __ndk_info,The $(NDK_TARGET_TOOLCHAIN) toolchain does not support the $(TARGET_ARCH_ABI) ABI.)\
|
||||||
|
$(call __ndk_info,Please modify the APP_ABI definition in $(NDK_APP_APPLICATION_MK) to fix this)\
|
||||||
|
$(call __ndk_info,Valid ABIs values for $(NDK_TARGET_TOOLCHAIN) are: $(NDK_TARGET_TOOLCHAIN.$(NDK_TOOLCHAIN).abis))\
|
||||||
|
$(call __ndk_error,Aborting)\
|
||||||
|
,)
|
||||||
|
|
||||||
TARGET_ABI := $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)
|
TARGET_ABI := $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)
|
||||||
|
|
||||||
# setup sysroot-related variables. The SYSROOT point to a directory
|
# setup sysroot-related variables. The SYSROOT point to a directory
|
||||||
@@ -27,7 +35,7 @@ TARGET_ABI := $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)
|
|||||||
# some libraries and object files used for linking the generated
|
# some libraries and object files used for linking the generated
|
||||||
# target files properly.
|
# target files properly.
|
||||||
#
|
#
|
||||||
SYSROOT := build/platforms/$(TARGET_PLATFORM)/arch-$(TARGET_ARCH_ABI)
|
SYSROOT := build/platforms/$(TARGET_PLATFORM)/arch-$(TARGET_ARCH)
|
||||||
|
|
||||||
TARGET_CRTBEGIN_STATIC_O := $(SYSROOT)/usr/lib/crtbegin_static.o
|
TARGET_CRTBEGIN_STATIC_O := $(SYSROOT)/usr/lib/crtbegin_static.o
|
||||||
TARGET_CRTBEGIN_DYNAMIC_O := $(SYSROOT)/usr/lib/crtbegin_dynamic.o
|
TARGET_CRTBEGIN_DYNAMIC_O := $(SYSROOT)/usr/lib/crtbegin_dynamic.o
|
||||||
@@ -40,7 +48,7 @@ TARGET_PREBUILT_SHARED_LIBRARIES := $(TARGET_PREBUILT_SHARED_LIBRARIES:%=$(SYSRO
|
|||||||
include $(NDK_TOOLCHAIN.$(TARGET_TOOLCHAIN).setup)
|
include $(NDK_TOOLCHAIN.$(TARGET_TOOLCHAIN).setup)
|
||||||
|
|
||||||
# compute NDK_APP_DEST as the destination directory for the generated files
|
# compute NDK_APP_DEST as the destination directory for the generated files
|
||||||
NDK_APP_DEST := $(NDK_APP_PROJECT_PATH)/libs/$(TARGET_ABI_SUBDIR)
|
NDK_APP_DEST := $(NDK_APP_PROJECT_PATH)/libs/$(TARGET_ARCH_ABI)
|
||||||
|
|
||||||
# free the dictionary of LOCAL_MODULE definitions
|
# free the dictionary of LOCAL_MODULE definitions
|
||||||
$(call modules-clear)
|
$(call modules-clear)
|
||||||
|
|||||||
@@ -16,4 +16,4 @@
|
|||||||
# config file for the arm-eabi-4.2.1 toolchain for the Android NDK
|
# config file for the arm-eabi-4.2.1 toolchain for the Android NDK
|
||||||
# the real meat is in the setup.mk file adjacent to this one
|
# the real meat is in the setup.mk file adjacent to this one
|
||||||
#
|
#
|
||||||
TOOLCHAIN_ABIS := arm
|
TOOLCHAIN_ABIS := armeabi
|
||||||
|
|||||||
19
ndk/build/toolchains/arm-eabi-4.4.0/config.mk
Normal file
19
ndk/build/toolchains/arm-eabi-4.4.0/config.mk
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright (C) 2009 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# config file for the arm-eabi-4.4.0 toolchain for the Android NDK
|
||||||
|
# the real meat is in the setup.mk file adjacent to this one
|
||||||
|
#
|
||||||
|
TOOLCHAIN_ABIS := armeabi armeabi-v7a
|
||||||
139
ndk/build/toolchains/arm-eabi-4.4.0/setup.mk
Normal file
139
ndk/build/toolchains/arm-eabi-4.4.0/setup.mk
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
# Copyright (C) 2009 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# this file is used to prepare the NDK to build with the arm-eabi-4.4.0
|
||||||
|
# toolchain any number of source files
|
||||||
|
#
|
||||||
|
# its purpose is to define (or re-define) templates used to build
|
||||||
|
# various sources into target object files, libraries or executables.
|
||||||
|
#
|
||||||
|
# Note that this file may end up being parsed several times in future
|
||||||
|
# revisions of the NDK.
|
||||||
|
#
|
||||||
|
|
||||||
|
TOOLCHAIN_NAME := arm-eabi-4.4.0
|
||||||
|
TOOLCHAIN_PREFIX := $(HOST_PREBUILT)/$(TOOLCHAIN_NAME)/bin/arm-eabi-
|
||||||
|
|
||||||
|
TARGET_CFLAGS.common := \
|
||||||
|
-I$(SYSROOT)/usr/include \
|
||||||
|
-fpic \
|
||||||
|
-mthumb-interwork \
|
||||||
|
-ffunction-sections \
|
||||||
|
-funwind-tables \
|
||||||
|
-fstack-protector \
|
||||||
|
-fno-short-enums \
|
||||||
|
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \
|
||||||
|
-D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
|
||||||
|
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
TARGET_ARCH_CFLAGS := -march=armv7-a \
|
||||||
|
-mfloat-abi=softfp \
|
||||||
|
-mfpu=neon
|
||||||
|
TARGET_ARCH_LDFLAGS := -Wl,--fix-cortex-a8
|
||||||
|
else
|
||||||
|
TARGET_ARCH_CFLAGS := -march=armv5te \
|
||||||
|
-mtune=xscale \
|
||||||
|
-msoft-float
|
||||||
|
TARGET_ARCH_LDFLAGS :=
|
||||||
|
endif
|
||||||
|
|
||||||
|
TARGET_arm_release_CFLAGS := -O2 \
|
||||||
|
-fomit-frame-pointer \
|
||||||
|
-fstrict-aliasing \
|
||||||
|
-funswitch-loops \
|
||||||
|
-finline-limit=300
|
||||||
|
|
||||||
|
TARGET_thumb_release_CFLAGS := -mthumb \
|
||||||
|
-Os \
|
||||||
|
-fomit-frame-pointer \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-finline-limit=64
|
||||||
|
|
||||||
|
# When building for debug, compile everything as arm.
|
||||||
|
TARGET_arm_debug_CFLAGS := $(TARGET_arm_release_CFLAGS) \
|
||||||
|
-fno-omit-frame-pointer \
|
||||||
|
-fno-strict-aliasing
|
||||||
|
|
||||||
|
TARGET_thumb_debug_CFLAGS := $(TARGET_thumb_release_CFLAGS) \
|
||||||
|
-marm \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
|
||||||
|
TARGET_CC := $(TOOLCHAIN_PREFIX)gcc
|
||||||
|
TARGET_CFLAGS := $(TARGET_CFLAGS.common) $(TARGET_ARCH_CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
TARGET_CXX := $(TOOLCHAIN_PREFIX)g++
|
||||||
|
TARGET_CXXFLAGS := $(TARGET_CFLAGS.common) $(TARGET_ARCH_CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
TARGET_LD := $(TOOLCHAIN_PREFIX)ld
|
||||||
|
TARGET_LDFLAGS := $(TARGET_ARCH_LDFLAGS)
|
||||||
|
|
||||||
|
TARGET_AR := $(TOOLCHAIN_PREFIX)ar
|
||||||
|
TARGET_ARFLAGS := crs
|
||||||
|
|
||||||
|
TARGET_LIBGCC := $(shell $(TARGET_CC) -mthumb-interwork -print-libgcc-file-name)
|
||||||
|
TARGET_LDLIBS := -Wl,-rpath-link=$(SYSROOT)/usr/lib
|
||||||
|
|
||||||
|
# These flags are used to ensure that a binary doesn't reference undefined
|
||||||
|
# flags.
|
||||||
|
TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
|
||||||
|
|
||||||
|
# NOTE: Ensure that TARGET_LIBGCC is placed after all private objects
|
||||||
|
# and static libraries, but before any other library in the link
|
||||||
|
# command line when generating shared libraries and executables.
|
||||||
|
#
|
||||||
|
# This ensures that all libgcc.a functions required by the target
|
||||||
|
# will be included into it, instead of relying on what's available
|
||||||
|
# on other libraries like libc.so, which may change between system
|
||||||
|
# releases due to toolchain or library changes.
|
||||||
|
#
|
||||||
|
define cmd-build-shared-library
|
||||||
|
$(TARGET_CC) \
|
||||||
|
-nostdlib -Wl,-soname,$(notdir $@) \
|
||||||
|
-Wl,-shared,-Bsymbolic \
|
||||||
|
$(PRIVATE_OBJECTS) \
|
||||||
|
-Wl,--whole-archive \
|
||||||
|
$(PRIVATE_WHOLE_STATIC_LIBRARIES) \
|
||||||
|
-Wl,--no-whole-archive \
|
||||||
|
$(PRIVATE_STATIC_LIBRARIES) \
|
||||||
|
$(TARGET_LIBGCC) \
|
||||||
|
$(PRIVATE_SHARED_LIBRARIES) \
|
||||||
|
$(PRIVATE_LDFLAGS) \
|
||||||
|
$(PRIVATE_LDLIBS) \
|
||||||
|
-o $@
|
||||||
|
endef
|
||||||
|
|
||||||
|
define cmd-build-executable
|
||||||
|
$(TARGET_CC) \
|
||||||
|
-nostdlib -Bdynamic \
|
||||||
|
-Wl,-dynamic-linker,/system/bin/linker \
|
||||||
|
-Wl,--gc-sections \
|
||||||
|
-Wl,-z,nocopyreloc \
|
||||||
|
$(TARGET_CRTBEGIN_DYNAMIC_O) \
|
||||||
|
$(PRIVATE_OBJECTS) \
|
||||||
|
$(PRIVATE_STATIC_LIBRARIES) \
|
||||||
|
$(TARGET_LIBGCC) \
|
||||||
|
$(PRIVATE_SHARED_LIBRARIES) \
|
||||||
|
$(PRIVATE_LDFLAGS) \
|
||||||
|
$(PRIVATE_LDLIBS) \
|
||||||
|
$(TARGET_CRTEND_O) \
|
||||||
|
-o $@
|
||||||
|
endef
|
||||||
|
|
||||||
|
define cmd-build-static-library
|
||||||
|
$(TARGET_AR) $(TARGET_ARFLAGS) $@ $(PRIVATE_OBJECTS)
|
||||||
|
endef
|
||||||
|
|
||||||
|
cmd-strip = $(TOOLCHAIN_PREFIX)strip --strip-debug $1
|
||||||
@@ -209,14 +209,25 @@ TARGET_ARCH
|
|||||||
|
|
||||||
TARGET_PLATFORM
|
TARGET_PLATFORM
|
||||||
Name of the target Android platform when this Android.mk is parsed.
|
Name of the target Android platform when this Android.mk is parsed.
|
||||||
For now, only 'android-3' is supported, which corresponds to the
|
For example, 'android-3' correspond to Android 1.5 system images. For
|
||||||
Android 1.5 platform.
|
a complete list of platform names and corresponding Android system
|
||||||
|
images, read docs/STABLE-APIS.TXT.
|
||||||
|
|
||||||
TARGET_ARCH_ABI
|
TARGET_ARCH_ABI
|
||||||
Name of the target CPU+ABI when this Android.mk is parsed.
|
Name of the target CPU+ABI when this Android.mk is parsed.
|
||||||
For now, only 'arm' is supported, which really means the following:
|
Two values are supported at the moment:
|
||||||
|
|
||||||
ARMv5TE or higher CPU, with 'softfloat' floating point support
|
armeabi
|
||||||
|
For Armv5TE
|
||||||
|
|
||||||
|
armeabi-v7a
|
||||||
|
|
||||||
|
NOTE: Up to Android NDK 1.6_r1, this variable was simply defined
|
||||||
|
as 'arm'. However, the value has been redefined to better
|
||||||
|
match what is used internally by the Android platform.
|
||||||
|
|
||||||
|
For more details about architecture ABIs and corresponding
|
||||||
|
compatibility issues, please read docs/CPU-ARCH-ABIS.TXT
|
||||||
|
|
||||||
Other target ABIs will be introduced in future releases of the NDK
|
Other target ABIs will be introduced in future releases of the NDK
|
||||||
and will have a different name. Note that all ARM-based ABIs will
|
and will have a different name. Note that all ARM-based ABIs will
|
||||||
@@ -228,8 +239,9 @@ TARGET_ABI
|
|||||||
as $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) and is useful when you want
|
as $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) and is useful when you want
|
||||||
to test against a specific target system image for a real device.
|
to test against a specific target system image for a real device.
|
||||||
|
|
||||||
By default, this will be 'android-3-arm'
|
By default, this will be 'android-3-armeabi'
|
||||||
|
|
||||||
|
(Up to Android NDK 1.6_r1, this used to be 'android-3-arm' by default)
|
||||||
|
|
||||||
NDK-provided function macros:
|
NDK-provided function macros:
|
||||||
- - - - - - - - - - - - - - -
|
- - - - - - - - - - - - - - -
|
||||||
|
|||||||
@@ -114,6 +114,25 @@ APP_BUILD_SCRIPT
|
|||||||
to point to an alternate build script. A non-absolute path will always
|
to point to an alternate build script. A non-absolute path will always
|
||||||
be interpreated as relative to the NDK's top-level directory.
|
be interpreated as relative to the NDK's top-level directory.
|
||||||
|
|
||||||
|
APP_ABI
|
||||||
|
By default, the NDK build system will generate machine code for the
|
||||||
|
'armeabi' ABI. This corresponds to an ARMv5TE based CPU with software
|
||||||
|
floating point operations. You can use APP_ABI to select a different
|
||||||
|
ABI.
|
||||||
|
|
||||||
|
For example, to support hardware FPU instructions on ARMv7 based devices,
|
||||||
|
use:
|
||||||
|
|
||||||
|
APP_ABI := armeabi-v7a
|
||||||
|
|
||||||
|
Or to support both ARMv5TE and ARMv7 based devices, use:
|
||||||
|
|
||||||
|
APP_ABI := armeabi armeabi-v7a
|
||||||
|
|
||||||
|
For the list of all supported ABIs and details about their usage / limitations
|
||||||
|
please read docs/CPU-ARCH-ABIS.TXT
|
||||||
|
|
||||||
|
|
||||||
A trivial Application.mk file would be:
|
A trivial Application.mk file would be:
|
||||||
|
|
||||||
-------------- cut here -------------------------
|
-------------- cut here -------------------------
|
||||||
|
|||||||
@@ -7,24 +7,60 @@ IMPORTANT BUG FIXES:
|
|||||||
|
|
||||||
- Fix build/host-setup.sh to execute as a Bourne shell script (again)
|
- Fix build/host-setup.sh to execute as a Bourne shell script (again)
|
||||||
|
|
||||||
- Make target shared libraries portable to systems that don't use the exact same
|
- Make target shared libraries portable to systems that don't use the exact
|
||||||
toolchain (GCC 4.2.1) .
|
same toolchain. This is needed due to differences in libgcc.a implementations
|
||||||
|
between gcc 4.2.1 and 4.4.0. This change ensures that generated machine
|
||||||
- Actually use the awk version detected by host-setup.sh during the build.
|
code doesn't depend on helper functions provided by the Android platform
|
||||||
|
runtime.
|
||||||
|
|
||||||
|
|
||||||
IMPORTANT CHANGES:
|
IMPORTANT CHANGES:
|
||||||
|
|
||||||
- Added platform eclair-5 to reflect the Eclair branch. This is merely a copy
|
- Support for hardware FPU. This is through the new 'armeabi-v7a' ABI
|
||||||
|
corresponding to ARMv7-a class devices.
|
||||||
|
|
||||||
|
Note that by default, the NDK will still generate machine code for the old
|
||||||
|
'armeabi' ABI (ARMv5TE based) which is supported by all official Android
|
||||||
|
system images to date.
|
||||||
|
|
||||||
|
You will need to define APP_ABI in your Application.mk file to change this.
|
||||||
|
See docs/APPLICATION-MK.TXT
|
||||||
|
|
||||||
|
More details about ABIs is now available in docs/CPU-ARCH-ABIS.TXT
|
||||||
|
|
||||||
|
- GCC 4.4.0 is now used by default by the NDK. It generates better code than
|
||||||
|
GCC 4.2.1, which was used in previous releases. However, the compiler's C++
|
||||||
|
frontend is also a lot more pedantic regarding certain template constructs
|
||||||
|
and will even refuse to build some of them.
|
||||||
|
|
||||||
|
For this reason, the NDK also comes with GCC 4.2.1 prebuilt binaries, and
|
||||||
|
you can force its usage by defining NDK_TOOLCHAIN in your environment to
|
||||||
|
the value 'arm-eabi-4.2.1'. For example:
|
||||||
|
|
||||||
|
export NDK_TOOLCHAIN=arm-eabi-4.2.1
|
||||||
|
make APP=hello-jni
|
||||||
|
|
||||||
|
Note that only the 'armeabi' ABI is supported by the 4.2.1 toolchain. We
|
||||||
|
recommend switching to 4.2.1 *only* if you encounter compilation problems
|
||||||
|
with 4.4.0.
|
||||||
|
|
||||||
|
The 4.2.1 prebuilt binaries will probably be removed from a future release
|
||||||
|
of the Android NDK, we thus *strongly* invite you to fix your code if such
|
||||||
|
problems happen.
|
||||||
|
|
||||||
|
- Support for OpenGL ES 2.0. This is through the new 'android-5' platform to
|
||||||
|
reflect Android 2.0 (previously the Eclair branch). This is merely a copy
|
||||||
of android-4 that also includes headers and libraries for OpenGL ES 2.0.
|
of android-4 that also includes headers and libraries for OpenGL ES 2.0.
|
||||||
|
|
||||||
See the sample named "hello-gl2" for a *very* basic demonstration. Note that
|
See the sample named "hello-gl2" for a *very* basic demonstration. Note that
|
||||||
OpenGL ES 2.0 is currently *not* available from Java, and must be used through
|
OpenGL ES 2.0 is currently *not* available from Java, and must be used
|
||||||
native code exclusively.
|
through native code exclusively.
|
||||||
|
|
||||||
|
|
||||||
OTHER FIXES & CHANGES:
|
OTHER FIXES & CHANGES:
|
||||||
|
|
||||||
|
- Actually use the awk version detected by host-setup.sh during the build.
|
||||||
|
|
||||||
- Added --prebuilt-ndk=FILE option to build/tools/make-release.sh script to
|
- Added --prebuilt-ndk=FILE option to build/tools/make-release.sh script to
|
||||||
package a new experimental NDK package archive from the current source tree
|
package a new experimental NDK package archive from the current source tree
|
||||||
plus the toolchain binaries of an existing NDK release package. E.g.:
|
plus the toolchain binaries of an existing NDK release package. E.g.:
|
||||||
@@ -58,6 +94,17 @@ OTHER FIXES & CHANGES:
|
|||||||
st_ctimensec) to <stat.h>
|
st_ctimensec) to <stat.h>
|
||||||
- add missing declaration for tzset() in <time.h>
|
- add missing declaration for tzset() in <time.h>
|
||||||
|
|
||||||
|
- Added build/tools/download-toolchain-sources.sh, a script that allows you
|
||||||
|
to download the toolchain sources from the official open-source repository
|
||||||
|
at android.git.kernel.org and nicely package them into a tarball that can
|
||||||
|
later be used by build/tools/build-toolchain.sh to rebuild the prebuilt
|
||||||
|
binaries for your system.
|
||||||
|
|
||||||
|
- Updated build/tools/build-toolchain.sh to support the tarballs generated
|
||||||
|
by download-toolchain-sources.sh with the --package=<file> option. This
|
||||||
|
also builds both gcc 4.2.1 and 4.4.0, adding support for armeabi-v7a to
|
||||||
|
gcc 4.4.0.
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
android-ndk-1.6_r1
|
android-ndk-1.6_r1
|
||||||
|
|
||||||
|
|||||||
225
ndk/docs/CPU-ARCH-ABIS.TXT
Normal file
225
ndk/docs/CPU-ARCH-ABIS.TXT
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
Android Native CPU ABI Management
|
||||||
|
|
||||||
|
|
||||||
|
Introduction:
|
||||||
|
=============
|
||||||
|
|
||||||
|
Every piece of native code generated with the Android NDK matches a given
|
||||||
|
"Application Binary Interface" (ABI) that defines exactly how your
|
||||||
|
application's machine code is expected to interact with the system at
|
||||||
|
runtime.
|
||||||
|
|
||||||
|
A typical ABI describes things in *excruciating* details, and will typically
|
||||||
|
include the following information:
|
||||||
|
|
||||||
|
- the CPU instruction set that the machine code should use
|
||||||
|
|
||||||
|
- the endianess of memory stores and loads at runtime
|
||||||
|
|
||||||
|
- the format of executable binaries (shared libraries, programs, etc...)
|
||||||
|
and what type of content is allowed/supported in them.
|
||||||
|
|
||||||
|
- various conventions used to pass data between your code and
|
||||||
|
the system (e.g. how registers and/or the stack are used when functions
|
||||||
|
are called, alignment constraints, etc...)
|
||||||
|
|
||||||
|
- alignment and size constraints for enum types, structure fields and
|
||||||
|
arrays.
|
||||||
|
|
||||||
|
- the list of function symbols available to your machine code at runtime,
|
||||||
|
generally from a very specific selected set of libraries.
|
||||||
|
|
||||||
|
This document lists the exact ABIs supported by the Android NDK and the
|
||||||
|
official Android platform releases.
|
||||||
|
|
||||||
|
|
||||||
|
I. Supported ABIs:
|
||||||
|
==================
|
||||||
|
|
||||||
|
Each supported ABI is identified by a unique name.
|
||||||
|
|
||||||
|
|
||||||
|
I.1. 'armeabi'
|
||||||
|
--------------
|
||||||
|
|
||||||
|
This is the name of an ABI for ARM-based CPUs that support *at* *least*
|
||||||
|
the ARMv5TE instruction set. Please refer to following documentation for
|
||||||
|
more details:
|
||||||
|
|
||||||
|
- ARM Architecture Reference manual (a.k.a ARMARM)
|
||||||
|
- Procedure Call Standard for the ARM Architecture (a.k.a. AAPCS)
|
||||||
|
- ELF for the ARM Architecture (a.k.a. ARMELF)
|
||||||
|
- ABI for the ARM Architecture (a.k.a. BSABI)
|
||||||
|
- Base Platform ABI for the ARM Architecture (a.k.a. BPABI)
|
||||||
|
- C Library ABI for the ARM Architecture (a.k.a. CLIABI)
|
||||||
|
- C++ ABI for the ARM Architecture (a.k.a. CPPABI)
|
||||||
|
- Runtime ABI for the ARM Architecture (a.k.a. RTABI)
|
||||||
|
|
||||||
|
- ELF System V Application Binary Interface
|
||||||
|
(DRAFT - 24 April 2001)
|
||||||
|
|
||||||
|
- Generic C++ ABI (http://www.codesourcery.com/public/cxx-abi/abi.html)
|
||||||
|
|
||||||
|
Note that the AAPCS standard defines 'EABI' as a moniker used to specify
|
||||||
|
a _family_ of similar but distinct ABIs. Android follows the little-endian
|
||||||
|
ARM GNU/Linux ABI as documented in the following document:
|
||||||
|
|
||||||
|
http://www.codesourcery.com/gnu_toolchains/arm/arm_gnu_linux_abi.pdf
|
||||||
|
|
||||||
|
With the exception that wchar_t is only one byte. This should not matter
|
||||||
|
in practice since wchar_t is simply *not* really supported by the Android
|
||||||
|
platform anyway.
|
||||||
|
|
||||||
|
This ABI does *not* support hardware-assisted floating point computations.
|
||||||
|
Instead, all FP operations are performed through software helper functions
|
||||||
|
that come from the compiler's libgcc.a static library.
|
||||||
|
|
||||||
|
Thumb (a.k.a. Thumb-1) instructions are supported. Note that the NDK
|
||||||
|
will generate thumb code by default, unless you define LOCAL_ARM_MODE
|
||||||
|
in your Android.mk (see docs/ANDROID-MK.TXT for all details).
|
||||||
|
|
||||||
|
|
||||||
|
I.2. 'armeabi-v7a'
|
||||||
|
------------------
|
||||||
|
|
||||||
|
This is the name of another ARM-based CPU ABI that *extends* 'armeabi' to
|
||||||
|
include a few CPU instruction set extensions as described in the following
|
||||||
|
document:
|
||||||
|
|
||||||
|
- ARM Architecture v7-a Reference Manual
|
||||||
|
|
||||||
|
The instruction extensions supported by this Android-specific ABI are:
|
||||||
|
|
||||||
|
- The Thumb-2 instruction set extension.
|
||||||
|
- The VFP hardware FPU instructions.
|
||||||
|
|
||||||
|
More specifically, VFPv3-D32 is being used, which corresponds to 32
|
||||||
|
dedicated 64-bit floating point registers provided by the CPU.
|
||||||
|
|
||||||
|
Other extensions described by the v7-a ARM like Advanced SIMD (a.k.a. NEON)
|
||||||
|
or ThumbEE are optional to this ABI, which means that developers should
|
||||||
|
check *at* *runtime* whether the extensions are available and provide
|
||||||
|
alternative code paths if this is not the case.
|
||||||
|
|
||||||
|
(Just like one typically does on x86 systems to check/use MMX/SSE2/etc...
|
||||||
|
specialized instructions).
|
||||||
|
|
||||||
|
IMPORTANT NOTE: This ABI enforces that all double values are passed during
|
||||||
|
function calls in 'core' register pairs, instead of dedicated FP ones.
|
||||||
|
However, all internal computations can be performed with the FP registers
|
||||||
|
and will be greatly sped up.
|
||||||
|
|
||||||
|
This little constraint, while resulting in a slight decrease of
|
||||||
|
performance, ensures binary compatibility with all existing 'armeabi'
|
||||||
|
binaries.
|
||||||
|
|
||||||
|
IMPORTANT NOTE: The 'armeabi-v7a' machine code will *not* run on ARMv5 or
|
||||||
|
ARMv6 based devices.
|
||||||
|
|
||||||
|
|
||||||
|
II. Generating code for a specific ABI:
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
By default, the NDK will generate machine code for the 'armeabi' ABI.
|
||||||
|
You can however add the following line to your Application.mk to generate
|
||||||
|
ARMv7-a compatible machine code instead:
|
||||||
|
|
||||||
|
APP_ABI := armeabi-v7a
|
||||||
|
|
||||||
|
It is also possible to build machine code for *two* distinct ABIs by using:
|
||||||
|
|
||||||
|
APP_ABI := armeabi armeabi-v7a
|
||||||
|
|
||||||
|
This will instruct the NDK to build two versions of your machine code: one for
|
||||||
|
each ABI listed on this line. Both libraries will be copied to your application
|
||||||
|
project path and will be ultimately packaged into your .apk.
|
||||||
|
|
||||||
|
Such a package is called a "fat binary" in Android speak since it contains
|
||||||
|
machine code for more than one CPU architecture. At installation time, the
|
||||||
|
package manager will only unpack the most appropriate machine code for the
|
||||||
|
target device. See below for details.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
III. ABI Management on the Android platform:
|
||||||
|
============================================
|
||||||
|
|
||||||
|
This section provides specific details about how the Android platform manages
|
||||||
|
native code in application packages.
|
||||||
|
|
||||||
|
|
||||||
|
III.1. Native code in Application Packages:
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
It is expected that shared libraries generated with the NDK are stored in
|
||||||
|
the final application package (.apk) at locations of the form:
|
||||||
|
|
||||||
|
lib/<abi>/lib<name>.so
|
||||||
|
|
||||||
|
Where <abi> is one of the ABI names listed in section II above, and <name>
|
||||||
|
is a name that can be used when loading the shared library from the VM
|
||||||
|
as in:
|
||||||
|
|
||||||
|
System.loadLibrary("<name>");
|
||||||
|
|
||||||
|
Since .apk files are just zip files, you can trivially list their content
|
||||||
|
with a command like:
|
||||||
|
|
||||||
|
unzip -l <apk>
|
||||||
|
|
||||||
|
to verify that the native shared libraries you want are indeed at the
|
||||||
|
proper location. You can also place native shared libraries at other
|
||||||
|
locations within the .apk, but they will be ignored by the system, or more
|
||||||
|
precisely by the steps described below; you will need to extract/install
|
||||||
|
them manually in your application.
|
||||||
|
|
||||||
|
In the case of a "fat" binary, two distinct libraries are thus placed in
|
||||||
|
the .apk, for example at:
|
||||||
|
|
||||||
|
lib/armeabi/libfoo.so
|
||||||
|
lib/armeabi-v7a/libfoo.so
|
||||||
|
|
||||||
|
|
||||||
|
III.2. Android Platform ABI support:
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
The Android system knows at runtime which ABI(s) it supports. More
|
||||||
|
precisely, up to two build-specific system properties are used to
|
||||||
|
indicate:
|
||||||
|
|
||||||
|
- the 'primary' ABI for the device, corresponding to the machine
|
||||||
|
code used in the system image itself.
|
||||||
|
|
||||||
|
- an optional 'secondary' ABI, corresponding to another ABI that
|
||||||
|
is also supported by the system image.
|
||||||
|
|
||||||
|
For example, a typical ARMv5TE-based device would only define
|
||||||
|
the primary ABI as 'armeabi' and not define a secondary one.
|
||||||
|
|
||||||
|
On the other hand, a typical ARMv7-based device would define the
|
||||||
|
primary ABI to 'armeabi-v7a' and the secondary one to 'armeabi'
|
||||||
|
since it can run application native binaries generated for both
|
||||||
|
of them.
|
||||||
|
|
||||||
|
|
||||||
|
III.3. Automatic extraction of native code at install time:
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
When installing an application, the package manager service will scan
|
||||||
|
the .apk and look for any shared library of the form:
|
||||||
|
|
||||||
|
lib/<primary-abi>/lib<name>.so
|
||||||
|
|
||||||
|
If one is found, then it is copied under $APPDIR/lib/lib<name>.so,
|
||||||
|
where $APPDIR corresponds to the application's specific data directory.
|
||||||
|
|
||||||
|
If none is found, and a secondary ABI is defined, the service will
|
||||||
|
then scan for shared libraries of the form:
|
||||||
|
|
||||||
|
lib/<secondary-abi>/lib<name>.so
|
||||||
|
|
||||||
|
If anything is found, then it is copied under $APPDIR/lib/lib<name>.so
|
||||||
|
|
||||||
|
This mechanism ensures that the best machine code for the target
|
||||||
|
device is automatically extracted from the package at installation
|
||||||
|
time.
|
||||||
@@ -27,7 +27,7 @@ currently supported:
|
|||||||
|
|
||||||
android-3 -> Official Android 1.5 system images
|
android-3 -> Official Android 1.5 system images
|
||||||
android-4 -> Official Android 1.6 system images
|
android-4 -> Official Android 1.6 system images
|
||||||
android-5 -> Experimental Eclair system images
|
android-5 -> Official Android 2.0 system images
|
||||||
|
|
||||||
II. Android-3 Stable Native APIs:
|
II. Android-3 Stable Native APIs:
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user