2013-03-03 25 views
6

Mam dwie biblioteki macierzyste innych firm, na przykład libfoo.so i libbar.so. Mam trudności z załadowaniem obu tych bibliotek. Skopiowałem je do folderu libs pod odpowiednim łukiem procesora (armeabi, mips i x86), a także ustawiono katalog Native libs pod Struktura projektu> Moduły> Android> Struktura, aby wskazać ten folder libs. Mogę załadować tylko jedną bibliotekę, ale nie drugą. Jeśli spróbuję załadować je pojedynczo (usuwając inne biblioteki), działa dobrze. Wyjątek, który otrzymuję:Jak dodać wiele bibliotek rodzimych (.so) w systemie IntelliJ

java.lang.UnsatisfiedLinkError: Couldn't load foo from loader dalvik.system.PathClassLoader 

Co należy zrobić, aby środowisko wykonawcze IntelliJ lub Android znalazło obie te biblioteki macierzyste?

+2

Jak je załadowałeś? – bricklore

+0

Czy szukałeś wynikowego pliku .APK, aby zobaczyć, co zostanie tam umieszczone? To tylko plik zip - otwórz go 7-Zip lub jakikolwiek inny menedżer plików zip i powinieneś zobaczyć wszystkie pliki .so tam. – SomeCallMeTim

+0

@SomeCallMeTime: Dziękuję koleś za nauczenie mnie, jak polecać biblioteki wewnątrz apk. Wystąpił problem z java.lang.UnsatisfiedLinkError: Nie znaleziono żadnej implementacji dla nativeNewInstance systemu Android mapy autonavi. Dodaję dwie niezależne biblioteki jni w moim kodzie. i okazało się, że jedna lib obsługuje wiele architektur cpu, a jedna obsługuje tylko armeabi, więc usunąłem inne architektury z tej, która obsługuje wiele procesorów i umieszczam tylko pliki armeabi w moim projekcie i teraz działa dobrze –

Odpowiedz

0

Jest całkowicie znaleźć, aby załadować wiele rodzimych bibliotek. Po prostu skopiuj je do katalogu/libs/CPU_ARCH /. Jednak wszystkie biblioteki muszą mieć taką samą architekturę. Jeśli powiemy, że libfoo.so to armeabi, ale libbar.so to x86, to tylko jeden zostanie skopiowany (jak na mój test jakiś czas temu).

Następnie można go załadować:

static { 
    //the following 3 are identical 
    //System.load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    //Runtime.getRuntime().load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    System.loadLibrary("foo"); 

    System.loadLibrary("bar"); 
} 

Jeśli System.loadLibrary() nie powiedzie, wówczas można spróbować obciążenie z pełną ścieżką używając System.load() lub() Runtime.getRuntime load()

.