2010-08-29 22 views
5

Bazı JNICALL işlevlerini içeren statik bir kitaplığım var, yani JVM'den çağrılması bekleniyor ve asla statik kitaplığı birbirine bağlayan paylaşılan kitaplık tarafından başvurulmuyor. Bununla birlikte, işlev sıyırma JNICALL işlevini yok etmek gibi görünüyor (kol-eabi-objdump -t'de görünmüyor) gibi görünüyor. JNICALL işlevini çağıran imkansız bir koşulu olan kukla bir işlev ekleyerek etrafta çalışıyorum ama bu kirli. Bazı modüllerin kullanılmayan veriyi almasını engellemek için bir bağlantı seçeneği olduğunu biliyorum, ama bu nedir? Ve bu seçeneği .mk dosyasında nasıl belirtirim? Kol-eabi-ld'de hemen belli bir şey görmedim.Bazı işlevlerin sıyrılmasını nasıl engellerim?

Tesadüfen, işlev sıyırma, paylaşılan kitaplıktaki JNICALL işlevlerini çıkarmaz, ancak paylaşılan kitaplığın bağlandığı statik kitaplıktan kaldırır. Bunun sebebi nedir?

+1

Bu yeni ortaya çıktı - http://stackoverflow.com/questions/3549432/preventing-functions-from-being-stripped-from-a-static-library-when-linked-into-a/3559733#3559733 – fadden

+0

Ve tabii ki, kişisel cevap adamım soldu. :) Bunu bir soru olarak gönderip kabul edebilir miyim? (Peki, ya da kendi sorumu bir dupe olarak kapatabilirim) – EboMike

cevap

5

Aslında, NDK ekibinin bunu desteklemeye başladığı (veya durdurulduğu) gibi görünüyor ve yapı sisteminde izleri var, ancak bazı hayati parçalar eksik. İyi haber, kolayca uygulanabiliyor olması.

NDK yüklemesindeki "derleme" dizinine gidin ve tüm LOCAL_STATIC_LIBRARIES örneklerini arayın. Hepsini kopyalayıp yapıştırın ve LOCAL_STATIC_WHOLE_LIBRARIES ile aynı şeyi yapan bir sürümü ekleyin.

kesin olmak için: build/çekirdek/build-binary.mk, sen gerekir:

LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES)) 
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES)) 
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES)) 
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries) 

[...]

$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries) 
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries) 

Not STATIC_WHOLE ve WHOLE_STATIC arasındaki tutarsızlık - o NDK ne kadar, bunun tutarsız olmasına rağmen bu şekilde tutmayı tercih bu.

Şimdi, build/toolchains/arm-eabi-4.4.0/setup.mk dizininde: Paylaşılan kitaplıklar için PRIVATE_WHOLE_STATIC_LIBRARIES bloğu zaten var. Bunları yürütme için de eklemeyi tercih edebilirsiniz, ancak bu muhtemelen gerekli değildir.

1
+0

Teşekkürler! Ben bir cevap aradığımı görmedim. Sorularımı diğer konu üzerinde tekrarlayacağım - Android.mk dosyasını nasıl kurmanız gerektiğine dair hızlı bir örnek gönderebilir misiniz (en azından bağlantıya uygun iki satır)? – EboMike

+0

Diğer soruya bir not ekledim. NDK oluşturma sisteminde tam olarak ne yapacağımı bilmiyorum, ancak genel Android makefile'leri gibi bir şey çalışıyorsa LOCAL_LDFLAGS'a bayrak ekleyebilirsiniz. – fadden

İlgili konular