2013-03-06 11 views
7

zacząłem rozwijanie bardzo prostą aplikację Android, który składa się z trzech części:Dalvik szuka pliku .so z rozszerzeniem ".0" - dlaczego?

  • aplikacja Java sama
  • fabrycznie wbudowane biblioteki współdzielonej (będziemy nazywać go libfoo)
  • kolejna wspólna biblioteka który korzysta z pre-built biblioteki (nazwijmy go libfoowrapper)

System plików wygląda mniej więcej tak:

jni 
Android.mk 
libfoo.so 
foowrapper.c 

Plik Android.mk zawiera następujące elementy:

LOCAL_PATH := $(call my-dir) 

#============================== 

include $(CLEAR_VARS) 

LOCAL_MODULE := foo-prebuilt 
LOCAL_SRC_FILES := libfoo.so 

include $(PREBUILT_SHARED_LIBRARY) 

#========================= 

include $(CLEAR_VARS) 

LOCAL_MODULE := foowrapper 
LOCAL_SRC_FILES := foowrapper.c 

LOCAL_SHARED_LIBRARIES := foo-prebuilt 

include $(BUILD_SHARED_LIBRARY) 

Kiedy zbudować aplikację w Eclipse, wszystko wydaje się działać prawidłowo - nie błędy są zgłaszane. Jednak, kiedy przesłać aplikację do mojego Samsung Obejrzyj (z systemem Android 4.0.4), otrzymuję następujący błąd w dzienniku:

03-05 21:20:27.859: E/AndroidRuntime(20324): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]: 102 could not load needed library 'libfoo.so.0' for 'libfoowrapper.so' (load_library[1091]: Library 'libfoo.so.0' not found) 

Dlaczego Dalvik szuka .so.0 pliku zamiast pliku .so? Jakie zmiany muszę wprowadzić w mojej aplikacji, aby pozbyć się tego błędu?

+0

mógłbyś skopiować jak cię ładują biblioteki po stronie Java? Musisz wykonać System.loadLibrary ("foo") i System.loadLibrary ("foowrapper") w statycznym bloku w Javie, we właściwej kolejności. Co więcej, czy próbowałeś tego w innych urządzeniach? – Esparver

+0

Brzmi jak "libfoowrapper.so" ma odniesienie do 'libfoo.so.0'. Sprawdź, z czym łączy się plik 'libfoowrapper.so'. – fadden

Odpowiedz

4

Przynajmniej w świecie Linuksa każda biblioteka współdzielona ma specjalną nazwę o nazwie soname. Nazwa soname ma przedrostek lib, nazwę biblioteki, wyrażenie .so, po którym następuje kropka i numer wersji, która jest zwiększana za każdym razem, gdy zmienia się interfejs (jako wyjątek specjalny, biblioteki C najniższego poziomu nie zaczynają się od lib). W pełni kwalifikowana nazwa soname zawiera jako prefiks katalog, w którym się znajduje; w działającym systemie w pełni kwalifikowana nazwa sonamiczna to po prostu symboliczny link do udostępnionej biblioteki: real name.

Każda biblioteka współdzielona ma także real name, która jest nazwą pliku zawierającą aktualny kod biblioteki. Prawdziwe nazwisko dodaje do soname okres, liczbę drugorzędną, inny okres i numer wydania. Ostatni okres i numer wydania są opcjonalne. Numer pomocniczy i numer wersji obsługują kontrolę konfiguracji, informując dokładnie, jakie wersje biblioteki są zainstalowane. Zauważ, że te liczby mogą nie być takie same, jak liczby używane do opisania biblioteki w dokumentacji, ale to ułatwia sprawę.

referencyjny: Linux Standard Base

Edit: Wydaje się to nie jest niczym niezwykłym problem, nie widzieli żadnych realnych rozwiązań, ale być może będzie to dobry początek do znalezienia czegoś, co działa dla Ciebie.

problem z LOCAL_SRC_FILES podczas korzystania PREBUILT_SHARED_LIBRARY https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k

Tworzenie niebędące wersjonowanych biblioteki współdzielone dla android http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/

biblioteki 'libproj.so.0' Nie znaleziono https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88

+0

To naprawdę moja wina, ponieważ nie sformułowałem tego lepiej, ale moim prawdziwym pytaniem jest "jak mogę to naprawić?" Moja aplikacja nie będzie działać w jej obecnej formie. –

+0

Dlaczego po prostu nie zmienić jego nazwy i nie sprawdzić, czy to działa? :) – kaderud

+0

Wtedy pojawia się błąd 'Android NDK: BŁĄD: jni/Android.mk: git2-prebuilt: LOCAL_SRC_FILES wskazuje na brakujący plik'. –