Cómo compilar el archivo so en Android
Android NDK compila varios archivos so
El archivo makefile Android.mk del sistema de compilación de Android está escrito de la siguiente manera
(1) Primero el archivo Android.mk necesita especificar LOCAL_PATH Variables utilizadas para buscar archivos fuente. Dado que generalmente
Android.mk y los archivos fuente a compilar están en el mismo directorio, se definen de la siguiente forma:
LOCAL_PATH:=$(call my-dir)
p>La declaración anterior significa definir la variable LOCAL_PATH en la ruta del directorio donde se encuentra el archivo de costos.
(2) Se pueden definir múltiples módulos de compilación en Android.mk, y cada módulo de compilación comienza con include $(CLEAR_VARS)
Termina con include $(BUILD_XXX).
include $(CLEAR_VARS)
CLEAR_VARS es proporcionado por el sistema de compilación, especificando GNU MAKEFILE para borrar todas las variables LOCAL_XXX excepto LOCAL_PATH para usted,
como LOCAL_MODULE , LOCAL_SRC_FILES, LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES, etc.
incluir $(BUILD_STATIC_LIBRARY) significa compilar en una biblioteca estática
incluir $(BUILD_SHARED_LIBRARY) significa compilar en una biblioteca dinámica.
incluir $(BUILD_EXECUTABLE) significa compilar en un programa ejecutable
(3) Por ejemplo, lo siguiente es (frameworks/base/libs/audioflinger/Android.mk): p>
LOCAL_PATH:= $(call my-dir)
incluir $(CLEAR_VARS) módulo uno
ifeq ($(AUDIO_POLICY_TEST),true)
ENABLE_AUDIO_DUMP: = verdadero
endif
LOCAL_SRC_FILES:= \
AudioHardwareGeneric.cpp \
AudioHardwareStub.cpp \
AudioHardwareInterface.cpp
ifeq ($(ENABLE_AUDIO_DUMP),true)
LOCAL_SRC_FILES += AudioDumpInterface.cpp
LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP p>
endif
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
libmedia \
libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
LOCAL_CFLAGS += -DGENERIC_AUDIO
endif
LOCAL_MODULE:= libaudiointerface
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
LOCAL_SRC_FILES += A2dpAudioInterface.cpp
LOCAL_SHARED_LIBRARIES + = liba2dp p>
LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
LOCAL_C_INCLUDES += $(llamar a include-path-for, bluez)
endif
include $ (BUILD_STATIC_LIBRARY) El módulo uno está compilado en una biblioteca estática
include $(CLEAR_VARS) El módulo dos
LOCAL_SRC_FILES:= \
AudioPolicyManagerBase.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libmedia
ifeq ($(TARGET_SIMULATOR) ,verdadero)
LOCAL_LDLIBS += -ldl
else
LOCAL_SHARED_LIBRARIES += libdl
endif
LOCAL_MODULE := libau
diopolicybase
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
LOCAL_CFLAGS += -DWITH_A2DP
endif
ifeq ($(AUDIO_POLICY_TEST) ,verdadero)
LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
endif
incluye $(BUILD_STATIC_LIBRARY) El módulo 2 está compilado en una biblioteca estática
incluir $ (CLEAR_VARS) Módulo 3
LOCAL_SRC_FILES:= \
AudioFlinger.cpp \
AudioMixer.cpp.arm \
AudioResampler .cpp .arm \
AudioResamplerSinc.cpp.arm \
AudioResamplerCubic.cpp.arm \
AudioPolicyService.cpp
LOCAL_SHARED_LIBRARIES : = \
libcutils \
libutils \
libbinder \
libmedia \
libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase
LOCAL_CFLAGS += -DGENERIC_AUDIO
else p>
LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy
endif
ifeq ($(TARGET_SIMULATOR),true)
LOCAL_LDLIBS += -ldl
else
LOCAL_SHARED_LIBRARIES += libdl
endif
LOCAL_MODULE:= libaudioflinger
ifeq ($(BOARD_HAVE_BLUETOOTH),true) p>
LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
LOCAL_SHARED_LIBRARIES += liba2dp
endif
ifeq ($(AUDIO_POLICY_TEST),true)< /p >
LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
endif
ifeq ($(TARGET_SIMULATOR),true)
ifeq ($(HOST_OS),linux )
LOCAL_LDLIBS += -lrt -lpthread
endif
endi
f
ifeq ($(BOARD_USE_LVMX),true)
LOCAL_CFLAGS += -DLVMX
LOCAL_C_INCLUDES += proveedor/nxp
LOCAL_STATIC_LIBRARIES += liblifevibes
LOCAL_SHARED_LIBRARIES += liblvmxservice
# LOCAL_SHARED_LIBRARIES += liblvmxipc
endif
include $(BUILD_SHARED_LIBRARY) El módulo 3 está compilado en la biblioteca dinámica
(4) Compilar una aplicación (APK)
LOCAL_PATH := $(call my-dir)
incluir $(CLEAR_VARS) p>
# Construye todos los archivos java en el subdirectorio java-->Traducción literal (construye todos los archivos Java en el subdirectorio java)
LOCAL_SRC_FILES := $(llamar a todos-subdir-java-files )
# Nombre del APK a construir-->Traducción literal (nombre del APK que se crea)
LOCAL_PACKAGE_NAME := LocalPackage
# Dígale que cree un APK -->Traducción literal (dígale que cree un APK)
incluye $(BUILD_PACKAGE)
(5) Compile una aplicación que dependa de una biblioteca Java estática (static.jar)
LOCAL_PATH := $(call my-dir)
incluye $(CLEAR_VARS)
# Lista de bibliotecas estáticas para incluir en el paquete
LOCAL_STATIC_JAVA_LIBRARIES := biblioteca estática
# Crea todos los archivos java en el subdirectorio java
LOCAL_SRC_FILES := $(llamar a todos los subdirectorios-java-files)
# Nombre del APK a construir
LOCAL_PACKAGE_NAME := LocalPackage
# Dígale que cree un APK
incluya $(BUILD_PACKAGE)
(6) Compile una aplicación que deba firmarse con la clave de plataforma
LOCAL_PATH := $(call my-dir)
incluya $(CLEAR_VARS) p>
# Construye todos los archivos java en el subdirectorio java
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Nombre del APK a construir< /p >
LOCAL_PACKAGE_NAME := LocalPa
ckage
LOCAL_CERTIFICATE := plataforma
# Dígale que cree un APK
incluya $(BUILD_PACKAGE)
(7) Compile uno Necesita usar la aplicación delante de una clave específica
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Construir todo archivos java en el subdirectorio java
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Nombre del APK a construir
LOCAL_PACKAGE_NAME : = LocalPackage
LOCAL_CERTIFICATE := proveedor/ejemplo/certs/app
# Dígale que cree un APK
incluya $(BUILD_PACKAGE)
( 8) Agregar una aplicación precompilada
LOCAL_PATH := $(call my-dir)
incluir $(CLEAR_VARS)
# El nombre del módulo debe coincidir nombre del apk que se instalará.
LOCAL_MODULE := LocalModuleName
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
incluir $(BUILD_PREBUILT)
(9) Agregar una biblioteca JAVA estática
LOCAL_PATH := $(llamar a mi- dir )
include $(CLEAR_VARS)
# Crea todos los archivos java en el subdirectorio java
LOCAL_SRC_FILES := $(call all-subdir-java-files )
# Cualquier biblioteca de la que depende esta biblioteca
LOCAL_JAVA_LIBRARIES := android.test.runner
# El nombre del archivo jar a crear
LOCAL_MODULE := muestra
# Construye un archivo jar estático.
incluye $(BUILD_STATIC_JAVA_LIBRARY)
(10) En medio del compilado módulo de Android.mk Puede definir el contenido de compilación relevante, es decir, especificar las variables relevantes de la siguiente manera:
LOCAL_AAPT_FLAGS
LOCAL_ACP_UNAVAILABLE
LOCAL_ADDITIONAL_JAVA_DIR
LOCAL_
AIDL_INCLUDES
LOCAL_ALLOW_UNDEFINED_SYMBOLS
LOCAL_ARM_MODE
LOCAL_ASFLAGS
LOCAL_ASSET_DIR
LOCAL_ASSET_FILES Compila la aplicación en el archivo Android.mk (BUILD_PACKAGE), esta variable está configurada para representar archivos de recursos
Por lo general, se define como LOCAL_ASSET_FILES += $(call find-subdir-assets)
LOCAL_BUILT_MODULE_STEM
<. p> LOCAL_C_INCLUDES Ruta adicional del archivo de encabezado compilado en C/C++, use LOCAL_PATH para indicar el directorio donde se encuentra este archivoPor ejemplo:
LOCAL_C_INCLUDES += extlibs/zlib-1.2.3
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
LOCAL_CC especifica el compilador de C
LOCAL_CERTIFICATE autenticación de firma
LOCAL_CFLAGS define C/ adicional Compiladores de C++ Banderas (como definiciones de macros), por ejemplo: LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1
LOCAL_CLASSPATH
LOCAL_COMPRESS_MODULE_SYMBOLS
LOCAL_COPY_HEADERS Archivos de encabezado que deben copiado al instalar la aplicación LOCAL_COPY_HEADERS_TO debe definirse al mismo tiempo
LOCAL_COPY_HEADERS_TO La ruta de destino para copiar los archivos de encabezado al instalar la aplicación
LOCAL_CPP_EXTENSION Si su archivo C++ no tiene cpp como el sufijo del archivo, puede especificar el sufijo del archivo C++ a través de LOCAL_CPP_EXTENSION Nombre
Por ejemplo: LOCAL_CPP_EXTENSION := .cc
Tenga en cuenta que los sufijos del archivo C++ en el módulo unificado deben ser consistentes.
LOCAL_CPPFLAGS pasa indicadores adicionales al compilador de C++, como: LOCAL_CPPFLAGS += -ffriend-injection
LOCAL_CXX especifica el compilador de C++
LOCAL_DX_FLAGS
LOCAL_EXPORT_PACKAGE_RESOURCES
LOCAL_FORCE_STATIC_EXECUTABLE Si el programa ejecutable compilado va a estar vinculado estáticamente (no depende de ninguna biblioteca dinámica al ejecutarse), establezca LOCAL_FORCE_STATIC_EXECUTABLE:=true
Actualmente solo libc tiene En forma de biblioteca estática, solo la utilizan las aplicaciones en el directorio /sbin del sistema de archivos. Las aplicaciones en este directorio generalmente no se cargan cuando se ejecutan.
Otras partes del sistema de archivos sí. estar cargado estáticamente.
LOCAL_GENERATED_SOURCES
LOCAL_INSTRUMENTATION_FOR
LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME
LOCAL_INTERMEDIATE_SOURCES
LOCAL_INTERMEDIATE_TARGETS
LOCAL_IS_HOST_MODULE p> p>
LOCAL_JAR_MANIFEST
LOCAL_JARJAR_RULES
LOCAL_JAVA_LIBRARIES especifica las bibliotecas de clases java incluidas al compilar aplicaciones y bibliotecas java. Actualmente hay dos tipos: núcleo y marco
.En la mayoría de los casos, se define como: LOCAL_JAVA_LIBRARIES := marco central
Tenga en cuenta que LOCAL_JAVA_LIBRARIES no es necesario y no se permite definirlo al compilar el APK (el sistema lo agregará automáticamente)
LOCAL_JAVA_RESOURCE_DIRS
LOCAL_JAVA_RESOURCE_FILES
LOCAL_JNI_SHARED_LIBRARIES
LOCAL_LDFLAGS pasa parámetros adicionales al conector (asegúrese de prestar atención al orden de los parámetros)
LOCAL_LDLIBS compila programas ejecutables o bibliotecas Especifique bibliotecas adicionales, especifique la biblioteca en formato "-lxxx", por ejemplo:
LOCAL_LDLIBS += -lcurses -lpthread
LOCAL_LDLIBS += -Wl,-z,origin
LOCAL_MODULE El nombre del módulo generado (tenga en cuenta que el nombre de la aplicación usa LOCAL_PACKAGE_NAME en lugar de LOCAL_MODULE)
LOCAL_MODULE_PATH La ruta al módulo generado
LOCAL_MODULE_STEM
LOCAL_MODULE_TAGS indicadores de módulo generados
LOCAL_NO_DEFAULT_COMPILER_FLAGS
LOCAL_NO_EMMA_COMPILE
LOCAL_NO_EMMA_INSTRUMENT
LOCAL_NO_STANDARD_LIBRARIES
LOCAL_OVERRIDES_PACKAGES
LOCAL_PACKAGE_NAME El nombre de la aplicación APK
LOCAL_POST_PROCESS_COMMAND
LOCAL_PREBUILT_EXECUTABLES Se utiliza al precompilar incluyendo $(BUILD_PREBUILT) o $( BUILD_HOST_PREBUILT) para especificar el archivo ejecutable que debe copiarse
LOCAL_PREBUILT_JAVA_Libraries
Precompilación de Local_prebuilt_libs Incluyendo $ (Build_prebuilt) o $ (Build_host_prebuilt).
Ocal_prebuilt_obj_files
LOCAL_PREBUILT_STAN >
LO
CAL_PRELINK_MODULE Si se requiere procesamiento previo a la conexión (requerido por defecto, usado para optimización dinámica de la biblioteca)
LOCAL_REQUIRED_MODULES especifica los módulos de los que depende el módulo (cuando el módulo está instalado, los módulos de los que depende se instalarán simultáneamente )
LOCAL_RESOURCE_DIR
LOCAL_SDK_VERSION
LOCAL_SHARED_LIBRARIES Bibliotecas dinámicas enlazables
LOCAL_SRC_FILES archivos fuente compilados
LOCAL_STATIC_JAVA_LIBRARIES
LOCAL_STATIC_LIBRARIES Bibliotecas estáticas enlazables
LOCAL_UNINSTALLABLE_MODULE
LOCAL_UNSTRIPPED_PATH
LOCAL_WHOLE_STATIC_LIBRARIES especifica las bibliotecas estáticas completas que el módulo debe cargar (estas bibliotecas competentes no no permitir que se vincule el vinculador) Eliminar el código inútil)
LOCAL_YACCFLAGS
OVERRIDE_BUILT_MODULE_PATH