NDK, hem statik hem de paylaşılan önceden oluşturulmuş kitaplıkların kullanımını destekler. Bu işlevin başlıca iki kullanım alanı vardır:
- Kaynaklarınızı dağıtmadan kendi kitaplıklarınızı üçüncü taraf NDK geliştiricilerine dağıtma.
- Derlemenizi hızlandırmak için kendi kitaplıklarınızın önceden oluşturulmuş bir sürümünü kullanma.
Bu sayfada, önceden oluşturulmuş kitaplıkların nasıl kullanılacağı açıklanmaktadır.
Önceden oluşturulmuş bir kitaplık bildirme
Kullandığınız her önceden oluşturulmuş kitaplığı bağımsız bir modül olarak beyan etmeniz gerekir. Bunun için aşağıdaki adımları uygulayın:
- Modüle bir ad verin. Bu adın, önceden oluşturulmuş kitaplığın adıyla aynı olması gerekmez.
Modülün Android.mk dosyasında, sağladığınız önceden oluşturulmuş kitaplığın yolunu
LOCAL_SRC_FILES
öğesine atayın.LOCAL_PATH
değişkeninizin değerine göre yolu belirtin.Paylaşılan (
.so
) veya statik (.a
) kitaplık kullanmanıza bağlı olarakPREBUILT_SHARED_LIBRARY
veyaPREBUILT_STATIC_LIBRARY
ekleyin.
Aşağıda, önceden oluşturulmuş libfoo.so
kitaplığının kendisini açıklayan Android.mk dosyasıyla aynı dizinde bulunduğunu varsayan basit bir örnek verilmiştir.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
Bu örnekte, modülün adı önceden oluşturulmuş kitaplığın adıyla aynıdır.
Derleme sistemi, önceden oluşturulmuş paylaşılan kitaplığınızın bir kopyasını $PROJECT/obj/local
uygulamasına ve hata ayıklama bilgilerinden arınmış başka bir kopyayı $PROJECT/libs/<abi>
uygulamasına yerleştirir. Burada $PROJECT
, projenizin kök dizinidir.
Diğer modüllerdeki önceden oluşturulmuş kitaplığa referans verme
Diğer modüllerde önceden oluşturulmuş bir kitaplığa referans vermek için kitaplığın adını, söz konusu diğer modüllerle ilişkili Android.mk dosyalarında LOCAL_STATIC_LIBRARIES
veya LOCAL_SHARED_LIBRARIES
değişkeninin değeri olarak belirtin.
Örneğin, libfoo.so
kullanan modülün açıklaması aşağıdaki gibi olabilir:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
Burada, LOCAL_MODULE
önceden oluşturulmuş modeli ifade eden modülün adıdır. LOCAL_SHARED_LIBRARIES
ise önceden oluşturulmuş modülün adıdır.
Önceden oluşturulmuş kitaplıklar için üstbilgileri dışa aktarma
foo-user.c
içindeki kod, önceden oluşturulmuş kitaplıkla dağıtılan foo.h
gibi normalde bir üstbilgi dosyasında bulunan belirli bildirimlere bağlıdır. Örneğin, foo-user.c
aşağıdaki gibi bir satıra sahip olabilir:
#include <foo.h>
Böyle bir durumda, foo-user
modülünü oluştururken başlığı ve derleyiciye ekleme yolunu sağlamanız gerekir. Bu görevi gerçekleştirmenin basit bir yolu, dışa aktarmaları önceden oluşturulmuş modül tanımında kullanmaktır. Örneğin, foo.h
başlığı önceden oluşturulmuş modülle ilişkili include
dizininin altında olduğu sürece bunu aşağıdaki şekilde belirtebilirsiniz:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Buradaki LOCAL_EXPORT_C_INCLUDES
tanımı, derleme sisteminin, yolu önceden oluşturulmuş kitaplığın include
dizinine dışa aktarmasını sağlar. Bunu, söz konusu yolun başına bağlı modül için LOCAL_C_INCLUDES
değerine getirir.
Bu işlem, derleme sisteminin gerekli başlıkları bulmasına olanak tanır.
Önceden oluşturulmuş kitaplıklarda hata ayıklama
Hata ayıklama sembolleri içeren, önceden oluşturulmuş paylaşılan kitaplıklar sağlamanızı öneririz. NDK derleme sistemi, $PROJECT/libs/<abi>/
ürününe yüklediği kitaplık sürümündeki sembolleri her zaman kaldırır ancak ndk-gdb
ile hata ayıklama için hata ayıklama sürümünü kullanabilirsiniz.
Önceden oluşturulmuş kitaplıklar için ABI'leri seçin
Hedeflenen ABI'niz için önceden oluşturulmuş paylaşılan kitaplığınızın doğru sürümünü seçtiğinizden emin olmalısınız. Android.mk dosyasındaki TARGET_ARCH_ABI
değişkeni, derleme sistemini kitaplığın uygun sürümüne yönlendirebilir.
Örneğin, projenizde libfoo.so
kitaplığının iki sürümü olduğunu varsayalım:
armeabi/libfoo.so
x86/libfoo.so
Aşağıdaki snippet'te, derleme sisteminin kitaplık için uygun sürümü seçmesi için TARGET_ARCH_ABI
özelliğinin nasıl kullanılacağı gösterilmektedir:
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)
TARGET_ARCH_ABI
değeri olarak armeabi
belirttiyseniz derleme sistemi armeabi
dizininde bulunan libfoo.so
sürümünü kullanır. TARGET_ARCH_ABI
değeri olarak x86
belirttiyseniz derleme sistemi x86
dizinindeki sürümü kullanır.