2012-01-27 13 views
51

Masz powyższy błąd w aplikacji JNI systemu Android? Czytaj dalej ...Android NDK java.lang.UnsatisfiedLinkError: findLibrary zwrócił wartość null

Z góry, powiem, że już to rozwiązałem, na swój sposób, ale czuję, że coś w systemie budowania Androida (być może w odniesieniu do Eclipse) jest zepsute, i mam nadzieję uratować inne godziny bólu. Być może inni natknęli się na tę kwestię i mogą komentować, co dla nich działało.

Przez pewien czas miałem projekt Androida z kodem JNI, który opracowałem przy użyciu NDK. Następnie, dzisiaj, zmieniłem coś w kodzie java, a następnie puf, nie mogłem już załadować mojej biblioteki JNI. Nie udało z wyjątkiem takich jak:

E/AndroidRuntime( 999): java.lang.UnsatisfiedLinkError: Couldn't load mylibrary: findLibrary returned null

google i próbowałem wszystkiego (przebudowa, zamknąć i ponownie uruchomić Eclipse, etc, etc)

Co ostatecznie ustalone mój problem? Ja fizycznie odinstalowałem swoją aplikację z urządzenia, zanim spróbuję kolejnego uruchomienia. to jest to! Potem zadziałało. Co sprawdziło się dla ciebie?

+0

Mam zaobserwowałem dziwne zachowanie, kiedy musiałem skopiować plik .so z katalogu \ LIBS \ ARMEABI i umieścić go w katalogu \ LIBS, aby go odszukać. – BitBank

+1

Mam ten sam problem z moją aplikacją, niestety niektórzy moi klienci otrzymują ten problem (widzę w tym celu wiele raportów o awariach). Nie wiem, dlaczego dzieje się tak tylko w "niektórych", ale działa na większości. Nigdy też nie mogłem tego odtworzyć. Bardzo dziwne ... –

+0

Miałem dwa wystąpienia mojej aplikacji na urządzeniu, po prostu dodałem sharedUserId do manifestu i zapomniałem najpierw odinstalować starą wersję. Dzięki za przypomnienie! – Alan

Odpowiedz

2

po prostu miał podobny problem.

sprawdzić swój katalog /data/data/your.package.name/lib

kiedy ls w moim katalogu pakietu obecnie wyświetla:

lib -> /mismatched_uid/settings_10037/fs_1000 

prawdopodobnie przypadkowo włączył sharedUserId a tym samym biblioteka nie będzie już dostępna.

+3

czy mógłbyś to trochę wyjaśnić? Otrzymuję ten sam błąd i to, co właśnie powiedziałeś, jest dość daleko ponad moją głową – JuiCe

+0

W moim przypadku zmieniłem sharedUiserId = ".." w moim AndroidManifest. Tak więc aplikacja jest uruchamiana z innym użytkownikiem, ale foldery/pliki nadal należą do innego użytkownika. Po zakorzenieniu możesz przejść do katalogu/lib i użyć polecenia "ls", aby wskazać, do kogo należą pliki. – icyerasor

+0

Możesz 'ls -l/data/data/your.package.name/lib' na dowolnym telefonie, możesz jednak nie mieć dostępu do swojego rodzica. Musisz więc mieć zrootowane urządzenie _navigate_ do tego katalogu. –

1

Nie trzeba wykorzenić aplikację device..deploy na emulatorze i przeglądania plików

+0

Tak. Lub użyj kompilacji debugowania i narzędzia run-as na zabezpieczonych urządzeniach, które go obsługują. –

0

miały identyczne problemy. Po prostu wyczyściłem projekt i zadziałało. Mystery ..

11

Mam również ten problem, ale w mojej sytuacji używam moich bibliotek w innym projekcie. I nie sądzę, że to kwestia zaćmienia lub android-ndk.

można sprawdzić te wskazówki, które mogą prowadzić do UnsatisfiedLinkError i działa dobrze dla mnie, powodzenia :)

  1. muszą przestrzegać reguły nameing przez interfejs JNI za (powiedziałeś, że zrobiłeś z powodzeniem przed załadować biblioteki, więc można zignorować) i biblioteki muszą w katalogu /your project/libs/armeabi/
  2. jeśli zapewnić powyższe rzeczy są zrobione, to musisz upewnić się, że generowane są libs zainstalowane do swojej app.apk, w przeciwnym razie nadal nie będzie możliwe znajdź lib i thorw ciebie n błąd.aby to zrobić, należy kliknąć prawym przyciskiem myszy na nazwę projektu Eclipse, a następnie przejdź do Build Path - Configure Build Path, z menu po lewej stronie wybierz Java Budowa ścieżki, a następnie kliknij Order and Export zakładka w prawym panelu, zaznaczając pole wyboru przed nazwą biblioteki i kliknij OK, to czyste, rebui ld i uruchomisz projekt, a twoje biblioteki zostaną zainstalowane w app.apk, wszystko jest gotowe.

enter image description here

enter image description here

enter image description here

EDIT:

  1. słowem, UnsatisfiedLinkError są wyrzucane, jeśli biblioteka nie jest zainstalowany na swoim app.apk, więc c nie łączę się z sukcesem.
13

Jeśli próbujesz uruchomić swoją aplikację w symulatorze, upewnij się, że podałeś poprawną architekturę w Run -> Run Configurations -> Target (może być konieczne dodanie wymaganego symulatora za pomocą Window -> Android Virtual Device Manager).

Miałem ten sam problem podczas próby uruchomienia aplikacji w symulatorze Intela, podczas gdy aplikacja korzystała z prekompilowanej biblioteki do ARM.

+0

Prawo do rzeczy. – neevek

14

Jeśli masz rodzimy projekt z LOCAL_MODULE „libXYZ”, upewnij się, aby załadować go jako

System.loadLibrary("XYZ"); 
+0

to działało dla pierwszej części błędu, teraz dostaję java.lang.UnsatisfiedLinkError: method_name_here –

+1

To jest niesamowite shitty google! Kosztowało mnie to 2 godziny. Nie mogę się doczekać, aby ponownie utworzyć dla systemu Windows Mobile. – Harmen

1

Jeśli masz rodzimy projekt z „libXYZ.so”, upewnij się, że/system/lib/libXYZ.so nie istnieje na Twoim urządzeniu. Jest to bolesne Obejście: użyć

System.load("/data/data/your.package.name/lib/libXY.so") 

zamiast System.loadLibrary().

6

Wewnątrz folderu libs tworzę nowy folder o nazwie armeabi-v7a i skopiowałem plik .so z armeabi do nowego folderu. Rozwiązuje błąd.

+0

Rozwiązało to połowę moich problemów. – derpface

6

W moim przypadku podczas składania aplikacji System Application problem był związany z uprawnieniami. Po umieszczeniu plików ".so" w katalogu /system/lib/ lub /system/vendor/lib/ zmodyfikowałem domyślne uprawnienia przydzielone na 600 do 755. To działało dobrze.

+2

dzięki za udostępnienie! –

+1

Podczas gdy problem jest prawdziwy, twoje ustawienia są nieprawidłowe. Brakuje bitu wykonania, więc to nie zadziała w systemach ARM, które to wymuszają. Normalne uprawnienia plików .so na Androida to 755. –

+0

@ChrisStratton dzięki za poprawienie. Nie wspominam o tym, ale użyłem 755, domyślnie było 600 na jednym z urządzeń Android mojego laboratorium. – aditya

5

miałem ten sam problem i to tylko niektóre z problemów miałem z moim projekcie:


  1. Zmiana z System.load("hello-test"); do System.loadLibrary("hello-test");;
  2. Zmiana podpisu funkcji C na JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz): tutaj używasz Java_<java_package_name>_<java-class-name>_<function-name>;
  3. Dodanie ścieżki NDK do local.properties, w moim przypadku ndk.dir=<my-path-to-ndk-directory>; i
  4. Aktualizacja mojego build.gradle, aby również zawierała się w zakresie defaultConfig: ndk { moduleName "hello-test" }.

  • Nazwa pakietu: com.example.testndk
  • Java Nazwa klasy: TestNDK
  • nazwa źródła C: hello-test.c
  • JNI lokalizacja katalogu w strukturze projektu: AndroidProjects/TestNDK/app/src/main/jni

IDE: Android Studio 0.8.1.

+0

System.load() jest używany, gdy chcesz określić faktyczną ścieżkę i nazwę pliku, zwykle używa System.loadLibrary() z krótką nazwą biblioteki (bez ścieżki i bez prefiksu "lib" lub sufiksu ".so") –

+2

Dla mnie # 4 (w tym "ndk" w defaultConfig) załatwił sprawę. Dzięki! – Bill

+0

Dzięki za 'defaultConfig' w gradle. Nie udało mi się wykryć mojego błędu. – Tauqir

2

Żadna z poprzednich odpowiedzi nie rozwiązała mojego problemu, ale tak się stało: cały czas problemem był brak koniecznego podkatalogu i pliku. Wszystko, co miałem w moim folderze libs, to folder armeabi zawierający odpowiedni plik .so, ale powinno być tam 3 inne, z których każdy zawiera plik .so. Nie jestem jeszcze pewien, który z pozostałych trzech (armeabi-v7a, mips lub x86) był wymagany, ale wiem, że wszystkie trzy zostały wygenerowane automatycznie po dodaniu pliku Application.mk do tego samego folderu, co plik Android.mk i upewnił się, że ma on następujący wiersz:

APP_ABI := all 

Dla mnie ta linia to jedyny tekst w tym miejscu. Po uruchomieniu ndk-build plik Application.mk najwyraźniej powoduje utworzenie "wszystkich" 4 folderów i utworzenie w nich odpowiednich plików .so. Po zainstalowaniu Application.mk ponownie uruchomiłem ndk-build, a następnie wykonałem czysty i przejrzysty projekt Eclipse przed ponowną próbą. Wszystko działało idealnie.

1

Po prostu tak się stało, a problem polegał na tym, że urządzenie po prostu nie miało wystarczającej przestrzeni do zainstalowania biblioteki. Odinstalowałem kilka innych aplikacji, a następnie zadziałało.

4

Po pierwsze, sprawdź, czy masz pliki jni wewnątrz folderu libs w folderze eclipse lub jniLibs w Android studio. Podczas sprawdzania w dowolnym svn, sprawdź także, czy pliki .so nie są zaznaczone.

Mój scenariusz dotyczył budowania w studiu Android.

Gdy budujesz w androidowym studio, twoje pliki biblioteki .so lub (jni) powinny znajdować się w folderze \ src \ main \ jniLibs \ armeabi ***.

gdzie te pliki znajdą się wewnątrz \ libs \ armeabi ***. Tak w czasie zaćmienia.

Podczas budowania za pomocą Zaćmienia i Android Studio, musisz zmodyfikować swoją kompilację.plik z gradle jako

main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 

      // Fixed Issue : "android studio java.lang.unsatisfiedlinkerror: couldn't load find library returned null" 
      // Cause : For android studio : The JNI files should be placed in the /src/main/jniLibs folder. 
      // Fix : Mapping the jniLibs 's source Directories with Lib's folder 
      jniLibs.srcDirs = ['libs'] 
} 

Tutaj buduję projekt, wykorzystując zarówno studio android, jak i zaćmienie.

+0

mój problem nie został rozwiązany za pomocą ur metody –

+0

Niestety problem ten sam –

+1

możesz spróbować z: jniLibs.srcDir "src/main/libs" –

0

UnsatisfiedLinkerror jest rozwiązany przez this.Build pliku .so ponownie "ndk_build"

1

I dodaje

extern "C" 

przed funkcje zadeklarować
Ex:

extern "C" 
jstring 
Java_lara_myapplication_MainActivity_stringFromJNI(
      JNIEnv *env, 
    jobject /* this */) { 
    std::string hello = "Hello from C++"; 
    return env->NewStringUTF(hello.c_str()); 
} 

wówczas błąd zniknął

Powiązane problemy