2015-11-19 5 views
6

Ich habe eine Anwendung und eine native Bibliothek für Android entwickelt. Die native Bibliothek verwendet openSL ES für die Audioverarbeitung.Verknüpfung mit aktualisierten Bibliothek auf Android

In meiner Android.mk Datei habe ich die folgende Erklärung ab:

LOCAL_LDLIBS := -lOpenSLES 

Damit Ich vermute, dies bedeutet, dass die Anwendung dynamisch in der openSLES Bibliothek verbinden wird aus dem System/lib Ordner bei der die Vorrichtung Zeitpunkt, zu dem die Anwendung auf dem Gerät geladen/ausgeführt wird?

Das Problem, mit dem ich konfrontiert bin, ist, dass die Bibliotheken auf dem Gerät fehlerhaft sind und ich 3 aktualisierte Bibliotheken habe, die den Bugfix enthalten. Wenn möglich, wie kann ich sicherstellen, dass meine Mutter Bibliothek die drei Bibliotheken verwendet habe ich:

Libwilhelm.so 
libOpenMAXAL.so 
libOpenSLES.so 

Sie nur

ich ersetzen
LOCAL_LDLIBS := -lOpenSLES 

mit

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm 

Antwort

4

Solange Sie zielen Sie auf ein bestimmtes Gerät oder einen sehr begrenzten Satz von Geräten, ist die vorgeschlagene Lösung gut genug. Aber wenn Ihr Ziel eine öffentliche App ist, die auf verschiedenen Plattformen installiert wird, einschließlich der zukünftigen "N" -Version von Android und angepassten ROMs, einschließlich z. Samsung, sollten Sie vorsichtig mit den Systemabhängigkeiten dieser Bibliotheken sein.

Während OpenSLES und OpenMAXAL unschuldig sind (sie hängen nur von liblog und libwilhelm ab), erfordert Letzteres mehr Sorgfalt.

Mit Blick auf seine Android.mk, libwilhelm hängt von liblog libutils libmedia libbinder libstagefright libstagefright_foundation libcutils libgui libdl libeffects und libstagefright_http_support.

Nur liblog und libdl sind "offizielle" (das heißt, ein Teil der NDK). Die anderen hängen von der Plattform ab und ihre exportierten Funktionen können für verschiedene Geräte, die auf derselben Plattformebene laufen, inkompatibel sein.

Um auf der sicheren Seite zu sein, würde ich nur die Fixes einführen und weiterhin die Systemversion von libwilhelm verwenden, wenn möglich. Ich hoffe, Sie können so Ihre Systemabhängigkeiten reduzieren.

+0

Wie also stelle ich sicher, dass meine App meine Version von libOpenSLES.so statt der Buggy-Version in system/libs verwendet? Wie sollte meine Android.mk-Datei aussehen? – user1884325

+0

Ja, wenn Sie es in LOCAL_SHARED_LIBRARIES angeben, wird es auf dem Gerät mit Ihrem APK installiert. In den letzten Android-Versionen wird es automatisch geladen. Bei älteren Versionen lädt der Loader möglicherweise libs aus dem Systemverzeichnis, sodass Sie explizite System.loadLibrary() oder dlopen() verwenden können. –

+0

Wenn Sie älter sagen, sprechen wir über Pre-4.4.2? Und mit "loaded automatically" meinen Sie, dass meine lokale shared lib automatisch geladen wird? Wie kann ich überprüfen, wo die lib tatsächlich geladen ist, wenn die Anwendung auf einem Gerät gestartet wird? – user1884325

Verwandte Themen