2012-09-27 1 views
34

sto cercando di configurare Android.mk attraversare compilare codice nativo per sostenere chipset diverso e cioè armeabi, MIPS e x86. So che posso configurare Application.mk nel seguente modo per compilare il codice sorgente per diversi chip set:Android NDK: Come arrivare all'architettura del compilatore in modo dinamico Android.mk

APP_ABI := all 

questo innescherà script di build di Android NDK per compilare il codice sorgente per tutti i chipset. Tuttavia, voglio dire dinamicamente ad Android.mk di cercare diverse dipendenze di librerie statiche compilate con chipset diversi.

# 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) 

È possibile fare? Se è così, qualcuno può consigli su come farlo?

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

Se guardi ndk e altre librerie, usano definizioni come '#ifdef __arm__' ma non sono sicuro di dove sia definito o standardizzato – minsk

+0

Ciao, voglio fare esattamente la stessa cosa. Puoi darmi un esempio del file Andorid.mk e dove inserirlo nell'app ?? – jeevs

risposta

28

C'è TARGET_ARCH variabile che contiene il valore della corrente ABI in fase di costruzione. Si può usare il seguente modo:

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

Se si specifica APP_ABI := armeabi-v7a armeabi mips x86 o APP_ABI := all nel vostro Application.mk otterrete ogni valore di ABI separata.

+1

Ciao Sergey, grazie per il risposta. Ha funzionato come un fascino! Apprezzo anche il modo in cui mi hai dato un esempio su come posso usare meglio anche questo. Mi è stato anche sempre avvertimento fp durante la compilazione, ma anche questo ha deliberato che avverte anche :) – LuxuryMaster

+1

FYI, non so se u destinato il codice come aiuto extra, ma ho cercato comunque perché ero curioso :) LOCAL_CFLAGS: = = -mfpu vfp -mfloat -abi = softfp. Ho osservato che gli errori durante la compilazione MIPS dell'architettura, errored con il seguente: cc1plus: Errore: opzione non riconosciuta riga di comando "-mfpu = VFP" cc1plus: Errore: l'opzione della riga di comando non riconosciuto "-mfloat-abi = softfp". Questo significa che il frammento di codice corretta sarebbe LOCAL_CFLAGS sarebbero ifeq ($ (TARGET_ARCH), braccio) LOCAL_CFLAGS: = = -mfpu VFP -mfloat-abi = softfp $ (COMMON_FLAGS_LIST) altro LOCAL_CFLAGS: = $ (COMMON_FLAGS_LIST). endif. Destra? – LuxuryMaster

+0

Siete i benvenuti e grazie per questa grande osservazione! –

32

Controllare TARGET_ARCH_ABI:

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

$ TARGET_ARCH_ABI restituisce semplicemente tutto ciò che ho impostato in APP_ABI. C'è un modo per passare APP_ABI: = armeabi-v7a mips x64 o APP_ABI: = tutti? – LuxuryMaster

+3

È necessario impostare 'APP_ABI: = all' in' Application.mk', altrimenti 'NDK-build' utilizzerà solo il valore predefinito' armeabi' architettura. Per più architetture, NDK sarà iterativo chiamare il 'Android.mk' del file - ogni impostazione' $ (TARGET_ARCH_ABI) 'diverso tempo. –

+0

Ho pensato che stava tramontando 'APP_ABI' in' Android.mk', ma ho letto male. Scusate. – nneonneo