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)
Puoi condividere il tuo Android.mk? Non è chiaro come hai impostato i tuoi progetti. –
@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. –
Capisco che non hai ancora Android.mk funzionante, ma ne hai uno non ancora funzionante, vero? –