Utilizzare le librerie predefinite

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:

  1. Assegna un nome al modulo. Questo nome non deve necessariamente essere identico a quello del modello libreria stessa.
  2. Nel file Android.mk del modulo, assegna a LOCAL_SRC_FILES il percorso a alla libreria predefinita che fornisci. Specifica il percorso relativo della variabile LOCAL_PATH.

  3. Includi PREBUILT_SHARED_LIBRARY o PREBUILT_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.