Önceden oluşturulmuş kitaplıkları kullanma

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:

  1. Modüle bir ad verin. Bu adın, önceden oluşturulmuş kitaplığın adıyla aynı olması gerekmez.
  2. 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.

  3. Paylaşılan (.so) veya statik (.a) kitaplık kullanmanıza bağlı olarak PREBUILT_SHARED_LIBRARY veya PREBUILT_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.