NDK supporta l'uso di librerie predefinite, sia statiche che condivise. Là esistono due casi d'uso principali per questa funzionalità:
- Distribuzione delle proprie librerie a sviluppatori NDK di terze parti senza che distribuisce le fonti.
- Utilizzo di una versione predefinita delle tue librerie per velocizzare la build.
Questa pagina spiega come utilizzare le librerie predefinite.
Dichiara una libreria predefinita
Devi dichiarare ogni libreria predefinita che utilizzi come modulo indipendente. Da fare pertanto, segui questi passaggi:
- Assegna un nome al modulo. Questo nome non deve necessariamente essere identico a quello del modello libreria stessa.
Nel file Android.mk del modulo, assegna a
LOCAL_SRC_FILES
il percorso a alla libreria predefinita che fornisci. Specifica il percorso relativo della variabileLOCAL_PATH
.Includi
PREBUILT_SHARED_LIBRARY
oPREBUILT_STATIC_LIBRARY
, a seconda se utilizzi una libreria condivisa (.so
) o statica (.a
).
Ecco un esempio banale che presuppone che la libreria predefinita libfoo.so
risieda
nella stessa directory del file Android.mk che lo descrive.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
In questo esempio, il nome del modulo è lo stesso del modulo predefinito libreria.
Il sistema di compilazione inserisce una copia della libreria condivisa predefinita in
$PROJECT/obj/local
e un'altra copia, senza le informazioni di debug, in
$PROJECT/libs/<abi>
. Qui, $PROJECT
è la directory radice del progetto.
Fare riferimento alla libreria predefinita da altri moduli
Per fare riferimento a una libreria predefinita da altri moduli, specificane il nome come
della variabile LOCAL_STATIC_LIBRARIES
o LOCAL_SHARED_LIBRARIES
in
i file Android.mk associati agli altri moduli.
Ad esempio, la descrizione di un modulo che utilizza libfoo.so
potrebbe essere la seguente:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
Qui, LOCAL_MODULE
è il nome del modulo che fa riferimento al modello predefinito;
LOCAL_SHARED_LIBRARIES
è il nome del modello predefinito.
Esporta intestazioni per librerie predefinite
Il codice in foo-user.c
dipende da dichiarazioni specifiche che normalmente risiedono
in un file di intestazione, ad esempio foo.h
, distribuito con la libreria predefinita. Per
Ad esempio, foo-user.c
potrebbe avere una riga simile alla seguente:
#include <foo.h>
In questo caso, devi fornire l'intestazione e il percorso di inclusione del
del compilatore esistente quando crei il modulo foo-user
. Un modo semplice per farlo
usa le esportazioni nella definizione del modulo predefinito. Ad esempio, se
poiché l'intestazione foo.h
si trova nella directory include
associata alla
predefinito, puoi dichiararlo come segue:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
La definizione di LOCAL_EXPORT_C_INCLUDES
qui garantisce che il sistema di compilazione
esporta il percorso nella directory include
della libreria predefinita, anteponendo che
al valore di LOCAL_C_INCLUDES
per il modulo che dipende da questo.
Questa operazione consente al sistema di compilazione di trovare le intestazioni necessarie.
Debug delle librerie predefinite
Ti consigliamo di fornire librerie condivise predefinite contenenti il debug
. Il sistema di compilazione NDK rimuove sempre i simboli dalla versione
libreria che installa in $PROJECT/libs/<abi>/
, ma puoi usare lo strumento di debug
per il debug con ndk-gdb
.
Seleziona ABI per le librerie predefinite
Devi assicurarti di selezionare la versione corretta della tua libreria condivisa predefinita
per l'ABI target. La TARGET_ARCH_ABI
nel file Android.mk può puntare il sistema di compilazione alla
di Cloud Shell.
Ad esempio, supponiamo che il tuo progetto contenga due versioni della libreria
libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
Il seguente snippet mostra come utilizzare TARGET_ARCH_ABI
in modo che la build
seleziona la versione appropriata della libreria:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Se hai specificato armeabi
come valore di TARGET_ARCH_ABI
, la build
usa la versione di libfoo.so
che si trova nella directory armeabi
. Se
hai specificato x86
come valore TARGET_ARCH_ABI
, il sistema di compilazione utilizza
la versione nella directory x86
.