2011-01-18 28 views
14

Piszę projekt Androida, który ma warstwę Natywną pomagającą warstwie Javy, i utknąłem w miejscu, w którym spróbuj zrobić System.loadLibrary, jest to błąd rzucania, że ​​nie może go połączyć.Nie można dlopen (libsomething.so) Nie można załadować biblioteki: link_image [1995]: nie udało się połączyć biblioteki libsomething.so

Używam Docelowego NDK do zbudowania warstwy natywnej, a następnie za pomocą mrówki do kompilacji i tworzenia apk.

Po uruchomieniu urządzenia pojawia się następujący błąd.

Nie można dlopen (libsomething.so) Nie można załadować biblioteki: link_image [1995]: failed połączyć libsomething.so

Biblioteka dostać dołączone do apk i jest prawidłowo rozpakowane. Jeśli spróbuję ręcznie usunąć bibliotekę, a potem ją uruchomię, to faktycznie wyrzuci tę bibliotekę nieodnalezioną. Jest więc w stanie znaleźć bibliotekę, ale zgłasza ten błąd i nie jestem w stanie ustalić przyczyny tego błędu.

Proszę, pomóż mi.

Odpowiedz

10

Najpierw znajdź lokalizację pliku .so. a następnie można spróbować:

poniższym przykładzie założono lokalizację biblioteki dzielonej jako: /data/data/my.package/lib/libmysharedlibrary.so

try { 
    //System.loadLibrary("mysharedlibrary"); 
    System.load("/data/data/my.package/lib/libmysharedlibrary.so"); 
} catch (UnsatisfiedLinkError use) { 
    Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so"); 
} 
+0

Tak jak powiedziałem, biblioteka jest obecna w wymaganym miejscu. Otrzymuję komunikat wyjściowy z informacją, że próbuje on załadować bibliotekę, ale w rzeczywistości próbuje załadować, to daje mi ten błąd. Jednakże, ta próba też się spodoba .. O dziwo, ten sam apk działa na jednym urządzeniu, ale nie na drugim. I całkowicie zdezorientowany, dlaczego to zachowanie się dzieje. – Puneet

+0

Czy możesz zaktualizować ścieżkę pliku biblioteki na obu urządzeniach? – TheCottonSilk

+0

Jest on pakowany w apk, więc automatycznie się rozpakowuje podczas instalacji, do tego samego katalogu. to jest /data/data/package/lib/libsomething.so – Puneet

3

Ten błąd można również znaleźć podczas wywoływania metody System.load (String pathName) Metoda i just passing libraryName zamiast pełnej ścieżki do biblioteki.

Rozdzielczość: użyj System.loadLibrary (String nazwa_listy) Metoda i teraz przekazać LibraryName.

3

Czasami (przez większość czasu!) Twoja biblioteka wymaga innych bibliotek wymienionych przez @musefan. i możesz wypisać je jako readelf -d libs/armeabi/libmy.so. Jednak jest tu haczyk: ponieważ Android nie ma żadnego mechanizmu kontrolującego wersję biblioteki (tak jak w normalnym linuksie masz liblzma.so.1, liblzma.so.2, itp.) Biblioteka, której potrzebujesz, jest tam (liblzma.so), ALE nie ma żadnych symboli importowanych przez twoją bibliotekę. Oto przykład na żywo: korzystasz z funkcji zlokalizowanej w libutils.so. Cała wersja biblioteki ma tę funkcję, jednak funkcja PROTOTYPE tej funkcji została zmieniona pod koniec 2010 roku, więc aplikacja zbudowana dla wersji 4.0.4. NDK nie będzie działać na urządzeniach FroYo lub urządzeniach GB z takim samym symptomatycznym: dlopen nie można załadować biblioteki. Oto przepis, jak wykrywać takie przypadki: potrzebujesz zawartości folderu os/system/lib na swoim komputerze. Może to być folder zrzucony z urządzenia, jeśli jesteś aplikacją zewnętrzną opracowaną lub zbudowaną, jeśli jesteś programistą platformy.następnie wydać polecenie arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so a zobaczysz coś kłamstwo to w przypadku błędu
lib_mylib.so: undefined reference to android :: ZipFileRO :: getEntryInfo (void *, int *, długi *, * długi, długi *, * długo, długo *) const'`

Powiązane problemy