2015-11-19 7 views
6

Opracowałem aplikację i bibliotekę macierzystą dla systemu Android. Natywna biblioteka używa openSL ES do przetwarzania dźwięku.Łączenie ze zaktualizowaną biblioteką w systemie Android

W moim pliku Android.mk Mam następujące oświadczenie:

LOCAL_LDLIBS := -lOpenSLES 

Więc zgaduję, że oznacza to, że aplikacja będzie dynamicznie połączyć w bibliotece openSLES od systemu/lib folderu urządzenia Pod czas, kiedy aplikacja jest ładowana/wykonywana na urządzeniu?

Problem, przed którym stoję, polega na tym, że biblioteki w urządzeniu są błędne i mam 3 zaktualizowane biblioteki, które zawierają poprawkę. Jeśli to możliwe, w jaki sposób mogę się upewnić, że moja natywna biblioteka korzysta z 3 bibliotek mam:

Libwilhelm.so 
libOpenMAXAL.so 
libOpenSLES.so 

Czy ja po prostu zastąpić

LOCAL_LDLIBS := -lOpenSLES 

z

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm 

Odpowiedz

4

Dopóki celowane określone urządzenie lub bardzo ograniczony zestaw urządzeń, proponowane rozwiązanie jest wystarczająco dobre. Jeśli jednak Twoim celem jest aplikacja publiczna, która będzie instalowana na różnych platformach, w tym w przyszłej wersji Androida "na N" i niestandardowych ROM-ach, w tym np. Samsung, powinieneś być ostrożny z zależnościami systemowymi tych bibliotek.

Podczas gdy OpenSLES i OpenMAXAL są niewinne (zależą tylko od liblog i libwilhelm), ta ostatnia wymaga więcej uwagi.

Patrząc na jego Android.mk, libwilhelm zależy liblog libutils libmedia libbinder libstagefright libstagefright_foundation libcutils libgui libdl libeffects i libstagefright_http_support.

Tylko liblog i libdl są "oficjalne" (czyli część NDK). Pozostałe zależą od platformy, a ich wyeksportowane funkcje mogą być niekompatybilne z różnymi urządzeniami działającymi na tym samym poziomie platformy.

Aby być po bezpiecznej stronie, wprowadzam tylko poprawki i dalej używam systemowej wersji libwilhelm, jeśli to możliwe. Mam nadzieję, że w ten sposób można zmniejszyć zależności systemowe.

+0

Jak dokładnie mogę się upewnić, że moja aplikacja używa mojej wersji libOpenSLES.so zamiast wersji buggy w systemie/libs? W szczególności, jak powinien wyglądać mój plik Android.mk? – user1884325

+0

Tak, jeśli podasz go w LOCAL_SHARED_LIBRARIES, zostanie on zainstalowany na urządzeniu z plikiem APK. W ostatnich wersjach systemu Android będzie on ładowany automatycznie. W starszych wersjach program ładujący może preferować ładowanie bibliotek z katalogu systemowego, dzięki czemu można użyć jawnego System.loadLibrary() lub dlopen(). –

+0

Kiedy mówisz, że starszym mówimy o pre-4.4.2? A przez "załadowany automatycznie" masz na myśli, że moja lokalna udostępniona lib zostanie załadowana automatycznie? Jak zweryfikować, skąd faktycznie załadowana jest biblioteka podczas uruchamiania aplikacji na urządzeniu? – user1884325