2013-02-17 7 views
5

Ho una serie di librerie esistenti che ho bisogno di riutilizzare in un'applicazione Android. Il layout è simile a:Come creare più progetti nell'ordine di dipendenza corretto con Android NDK?

\ Libraries \ libOne
\ Libraries \ libTwo [libreria statica]
\ Libraries \ libThree
\ Applicazioni \ MyApplication \ [Applicazione]

libTwo dipende su libOne e libThree dipende da libTwo. Come posso ottenere che il sistema di compilazione crei tutte le librerie nell'ordine corretto? Sto cercando di usare Eclipse, ma se necessario posso usare la riga di comando.

Tutte queste librerie saranno eventualmente referenziate da un'applicazione Java (e usano JNI per interagire con esse). Qualche idea su come ho configurato i file di Android.mk/Application.mk?

Ho provato a usare BUILD_STATIC_LIBRARY per libTwo, ma in realtà non emette alcun file! Mi aspettavo un file libTwo.a, ma niente viene compilato o compilato.

Scrivo un Android.mk nell'applicazione? O un Android.mk per ogni progetto?

+0

Puoi condividere il tuo Android.mk? Non è chiaro come hai impostato i tuoi progetti. –

+0

@AlexCohn Non ho ancora Android.mk funzionante, questo è il problema. Sto cercando una risposta che descrive come costruire tutte e tre le librerie e farle collegarle insieme dall'applicazione principale. –

+0

Capisco che non hai ancora Android.mk funzionante, ma ne hai uno non ancora funzionante, vero? –

risposta

0

C'è una sezione Android nelle proprietà dei progetti, dove è possibile modificare le dipendenze della libreria. Può essere utilizzato solo se libOne libTwo e libThree sono contrassegnati come librerie nel pannello delle proprietà.

3

OK, ora vedo la modifica, e questo rende possibile rispondere alla domanda specifica.

È must hanno almeno un Android.mk di file per la vostra applicazione, se si desidera utilizzare Android NDK per costruire i vostri nativi biblioteca/i. Questo non è un requisito, però. È OK costruirlo con Cmake, o "toolchain standalone" con makefile "tradizionali", o con un plugin MS Visual Studio, o in qualsiasi altro modo. È il risultato che conta. Il risultato è un oggetto condiviso creato con un compilatore compatibile per un runtime bionico.

Ha senso Goode mettere la libreria in ${project_root}/libs/armeabi/ directory (per i dispositivi compatibili ARM v6, altre sottodirectory per x86, MIPS, braccio V7A) per consentire il costruttore APK pacchetto in modo corretto, per consentire all'installatore di app per decomprimere la versione corretta (compatibile con il processore del dispositivo) nella directory /data/data/${package_name}/lib sul dispositivo e, infine, essere in grado di utilizzare System.loadLibrary(short_name) per utilizzarlo da Java. Ma è anche possibile impacchettare il file so in modo diverso, decomprimerlo manualmente e caricarlo da qualsiasi posizione sul file system del dispositivo (a condizione che l'app abbia il permesso di scrivere e leggere questo file).

Ma se escludiamo i casi esotici, è molto più comodo avere un Android.mk nella directory ${project_root}/jni. In termini di comando ndk-build, ogni libreria è un MODULO separato, ma tutti e tre possono essere definiti in un file Android.mk. D'altra parte, se le tue librerie sono isolate (ad esempio provengono da terze parti separate), probabilmente preferirai creare tre file Android.mk. Fortunatamente, ndk-build non è altro che un wrapper su gnu make e la semplice istruzione include in Android.mk funziona come in qualsiasi altro makefile.

In sintesi, il tuo caso è probabilmente coperto da un semplice file di Applications/MyApplication/ [Application]/jni/Android.mk:

include ../../Libraries/libOne/Android.mk 
include ../../Libraries/libTwo/Android.mk 
include ../../Libraries/libThree/Android.mk 

Non so che cosa avete dipendenza tra libOne e libTwo, ma per libOne il file Libraries/libOne/Android.mk sarà simile

LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

e Libraries/libThree/Android.mk

LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 

È necessario eseguire ndk-build dalla directory Applications/MyApplication/ [Application], dal prompt dei comandi o tramite il plugin ADT di Eclipse.

aggiornamento lo stesso può essere espresso da uno Android.mk file nella directory jni:

LOCAL_PATH = ../../Libraries/libOne 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

LOCAL_PATH = ../../Libraries/libThree 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 
+0

Grazie per questo, ho provato a utilizzare più file Android.mk, ma ha causato problemi nel ridefinire LOCAL_PATH ('$ (chiama my-dir)' ha restituito la directory principale NDK, non la directory effettiva quando non è stata chiamata sulla prima riga! –

+0

Assolutamente ! '$ (call my-dir)' dovrebbe essere una delle primissime righe in un file, ma questo non ha nulla a che fare con la domanda di uno o più file Android.mk. Vedi ** update ** –