2012-09-27 13 views
34

Estoy intentando configurar Android.mk cruzar compilar código nativo para apoyar diferentes chipset saber armeabi, MIPS, y x86. Sé que puedo configurar Application.mk de la siguiente manera para compilar el código fuente para el conjunto de chips diferente:Android NDK: ¿Cómo obtener la arquitectura del compilador en Android.mk dinámicamente

APP_ABI := all 

Esto activará script de compilación de Android NDK-compilar el código fuente de todos los conjuntos de chips. Sin embargo, quiero decirle dinámicamente a Android.mk que busque diferentes dependencias de bibliotecas estáticas compiladas con diferentes conjuntos de chips.

# Get the architecture info 
ARCH := ???? 

include $(CLEAR_VARS) 
LOCAL_MODULE:= mylib 
LOCAL_SRC_FILES:= build/lib/libxxx_$(ARCH).a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
include $(PREBUILT_STATIC_LIBRARY) 

¿Es esto posible? Si es así, ¿alguien puede aconsejar cómo hacerlo?

Update: I tried something like this in Application.mk:

APP_ABI := armeabi armeabi-v7a mips x64 

with Android.mk:

# Get the architecture info 
ARCH := $(APP_ABI) 

include $(CLEAR_VARS) 
LOCAL_MODULE:= mylib 
LOCAL_SRC_FILES:= build/lib/libxxx_$(ARCH).a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
include $(PREBUILT_STATIC_LIBRARY) 

but it errors with the following:

The LOCAL_SRC_FILES for a prebuilt static library should only contain one item 

which makes sense. I want to pass APP_ABI := all in Application.mk and be able to dynamically reference it. Any ideas?

+0

Si mira ndk y otras librerías, usan definiciones como '#ifdef __arm__', pero no estoy seguro de dónde está definido o estandarizado – minsk

+0

Hola, quiero hacer exactamente lo mismo. ¿Me puede dar un ejemplo del archivo Andorid.mk y dónde colocarlo en la aplicación? – jeevs

Respuesta

28

Hay TARGET_ARCH variable que contiene el valor de la corriente que se está construyendo ABI. Se puede utilizar la siguiente manera:

ifeq ($(TARGET_ARCH),x86) 
    LOCAL_CFLAGS := $(COMMON_FLAGS_LIST) 
else 
    LOCAL_CFLAGS := -mfpu=vfp -mfloat-abi=softfp $(COMMON_FLAGS_LIST) 
endif 

Si especifica APP_ABI := armeabi-v7a armeabi mips x86 o APP_ABI := all en su Application.mk obtendrá todos y cada valor de ABI.

+1

Hola Sergey, gracias por la responder. ¡Funcionó a las mil maravillas! También aprecio cómo me dio un ejemplo sobre cómo puedo usar mejor esto también. También conseguía advertencia fp al compilar, pero esto también resolvió que advertir también :) – LuxuryMaster

+1

FYI, no estoy seguro si u pretende su código como ayuda extra, pero lo intenté igual porque tenía curiosidad LOCAL_CFLAGS :): = = -mfpu VFP -mfloat -abi = softfp. Observé que los errores durante la compilación de MIPS arquitectura, que con error con lo siguiente: cc1plus: Error: la opción de línea de comando no reconocido "-mfpu = VFP" cc1plus: Error: la opción de línea de comando no reconocido "softfp -mfloat-abi =". Esto significa que el fragmento de código correcto sería serían ifeq LOCAL_CFLAGS ($ (TARGET_ARCH), brazo) LOCAL_CFLAGS: = = -mfpu VFP -mfloat-abi = softfp $ (COMMON_FLAGS_LIST) demás LOCAL_CFLAGS: = $ (COMMON_FLAGS_LIST). endif. ¿Derecha? – LuxuryMaster

+0

¡Bienvenido y gracias por este gran comentario! –

32

Comprobar TARGET_ARCH_ABI:

ifeq($(TARGET_ARCH_ABI), armeabi-v7a) 
    # v7a-specific stuff 
endif 
+1

$ TARGET_ARCH_ABI simplemente devuelve lo que configuro en APP_ABI. ¿Hay alguna manera de que pueda aprobar APP_ABI: = armeabi armeabi-v7a mips x64 o APP_ABI: = todo? – LuxuryMaster

+3

Debe establecer 'APP_ABI: = all' en' Application.mk', de lo contrario 'NDK-build' sólo usará el valor por defecto' armeabi' arquitectura. Para arquitecturas múltiples, NDK llamará iterativamente a su archivo 'Android.mk' - cada vez configurando' $ (TARGET_ARCH_ABI) 'de manera diferente. –

+0

pensé que se estaba poniendo '' APP_ABI' en Android.mk', pero leí mal. Lo siento. – nneonneo

Cuestiones relacionadas