2013-02-17 8 views
5

Bir Android uygulamasında yeniden kullanmam gereken bir dizi mevcut kitaplığım var. Kütüphaneler \ libOne
Kütüphaneler \ libTwo [Statik kütüphane] \ Kütüphaneler \ libThree \

\ Uygulamalar \ MyApplication \ [Uygulama]Android NDK ile doğru bağımlılık düzeninde birden fazla proje nasıl oluşturulur?

libTwo bağlıdır \

: düzen benzer libOne ve libThree üzerinde libTwo bağlıdır. Tüm kütüphaneleri doğru sırada oluşturmak için yapı sistemini nasıl alabilirim? Eclipse'i kullanmaya çalışıyorum ama gerekirse komut satırını kullanabilirim.

Bu kitaplıkların tümü sonunda bir Java uygulaması tarafından başvurulacaktır (ve bunlarla etkileşimde bulunmak için JNI kullanın). Android.mk/Application.mk dosyalarını nasıl kurduğum hakkında herhangi bir ipucu var mı?

LibTwo için BUILD_STATIC_LIBRARY kullanmayı denedim, ancak aslında herhangi bir dosya çıkmıyor! Bir libTwo.a dosyasını bekliyordum, fakat hiçbir şey derlenmiyor ya da oluşturulmuyor.

Uygulamada bir Android.mk yazıyorum mu? Ya da her proje için bir Android.mk?

+0

size Android.mk paylaşır mısınız? Projelerini nasıl kurduğun belli değil. –

+0

@AlexCohn Henüz bir Android.mk işletim sistemim yok, sorun bu. Her üç kütüphanenin nasıl oluşturulacağını ve bunları ana uygulamadan nasıl birbirine bağlayacaklarını açıklayan bir cevap arıyorum. –

+0

Henüz bir Android.mk sürümü çalıştırmamış olduğunuzu anlıyorum, ancak henüz çalışmadığınız bir tane var, değil mi? –

cevap

0

Kütüphane bağımlılıklarını düzenleyebileceğiniz projelerin özelliklerinde bir android bölümü vardır. Yalnızca libOne libTwo ve libThree, özellikler panelinde kitaplıklar olarak işaretlenmişse kullanılabilir.

3

Tamam, şimdi düzenlemenizi görüyorum ve bu, belirli bir soruyu yanıtlamayı mümkün kılıyor. Eğer yerli kütüphane/ler oluşturmak için Android NDK kullanmak istiyorsanız

Sen zorunluluk uygulamanız için en az bir Android.mk dosya var. Gerçi bu bir şart değil. Cmake, ya da "geleneksel" makefiles ile "bağımsız bir toolchain" veya bir MS Visual Studio eklentisi veya başka bir şekilde inşa etmek tamamdır. Önemli olan sonucudur. Sonuç, biyonik çalışma zamanı için uyumlu bir derleyici ile oluşturulmuş bir paylaşılan nesnedir.

O ${project_root}/libs/armeabi/ dizinde kütüphane koymak Goode mantıklı (ARM v6 uyumlu cihazlara, x86 diğer alt dizinleri için, MIPS, kol v7a) APK oluşturucu uygulama yükleyici doğru sürümü açmak için izin vermek, doğru şekilde paketleyin izin (cihaz işlemcisi ile uyumlu) cihazda /data/data/${package_name}/lib dizinine ve son olarak da Java'dan kullanmak için System.loadLibrary(short_name)'u kullanabilir. Ama aynı zamanda so dosyasını farklı şekilde paketlemek, elle paketini açmak ve cihaz dosya sistemindeki herhangi bir yerden yüklemek (uygulamanızın bu dosyayı yazma ve okuma izninin olması koşuluyla) oldukça mümkündür.

Ancak, egzotik durumları filtrelersek, ${project_root}/jni dizininde bir Android.mk olması çok daha rahattır. ndk-build komutu bakımından, her kitaplık ayrı bir MODÜLdür, ancak üçü de bir Android.mk dosyasında tanımlanabilir. Öte yandan, kütüphaneleriniz izole edilmişse (örneğin, ayrı 3. şahıslardan geliyorsa), muhtemelen üç Android.mk dosyası oluşturmayı tercih edersiniz. Neyse ki, ndk-build gnu make etrafında bir sarmalayıcıdan başka bir şey değildir ve Android.mk'deki basit include ifadesi diğer maketlerde olduğu gibi çalışır.

Özetle, senin durumun muhtemelen basit Applications/MyApplication/ [Application]/jni/Android.mk dosyası kapsamındadır:

include ../../Libraries/libOne/Android.mk 
include ../../Libraries/libTwo/Android.mk 
include ../../Libraries/libThree/Android.mk 

Sana libOne ve libTwo arasında var bağımlılık ne bilmiyorum ama libOne için dosya Libraries/libOne/Android.mk

benzeyecek
LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

ve 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) 

ndk-build'u Applications/MyApplication/ [Application] dizininden - komut isteminden veya Eclipse ADT eklentisinden çalıştırmalısınız.

aynı jni dizinde bir Android.mk dosyası tarafından ifade edilebilir

güncelleme:

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) 
+0

Bunun için, birden fazla Android.mk dosyasını kullanmayı denedim, ancak LOCAL_PATH ('' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'dir-dir '' çağrısı '' '' nin yeniden tanımlanmasına neden olan problemler, ilk satırda çağrılmadıkça gerçek dizini değil, NDK çekirdek dizinini döndürdü! –

+0

Bir dosyadaki ilk satırlardan biri olmalı, ancak bunun bir veya birden fazla Android.mk dosyasıyla ilgisi yoktur. –

İlgili konular