2014-12-07 27 views
21

Próbuję użyć biblioteki PJSIP dla mojej aplikacji Android. Zbudowałem pjsua przykładową aplikację według tej instrukcji: https://trac.pjsip.org/repos/wiki/Getting-Started/AndroidNie można załadować biblioteki: reloc_library [1285]: nie można zlokalizować 'rand'

Ale gdy przykładowa aplikacja uruchamia, wyjątek wyzwala:

12-06 15:03:58.043: D/dalvikvm(628): Trying to load lib /data/data/org.pjsip.pjsua2.app/lib/libpjsua2.so 0x4129d980 
12-06 15:03:58.064: W/dalvikvm(628): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/pjsip/pjsua2/app/MyApp; 
12-06 15:03:58.064: D/AndroidRuntime(628): Shutting down VM 
12-06 15:03:58.064: W/dalvikvm(628): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
12-06 15:03:58.083: E/AndroidRuntime(628): FATAL EXCEPTION: main 
12-06 15:03:58.083: E/AndroidRuntime(628): java.lang.ExceptionInInitializerError 
12-06 15:03:58.083: E/AndroidRuntime(628): at org.pjsip.pjsua2.app.MainActivity.onCreate(MainActivity.java:85) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.Activity.performCreate(Activity.java:4465) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.os.Looper.loop(Looper.java:137) 
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.main(ActivityThread.java:4424) 
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.reflect.Method.invoke(Method.java:511) 
12-06 15:03:58.083: E/AndroidRuntime(628): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-06 15:03:58.083: E/AndroidRuntime(628): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-06 15:03:58.083: E/AndroidRuntime(628): at dalvik.system.NativeStart.main(Native Method) 
12-06 15:03:58.083: E/AndroidRuntime(628): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 37 cannot locate 'rand'... 
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.Runtime.loadLibrary(Runtime.java:370) 
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.System.loadLibrary(System.java:535) 
12-06 15:03:58.083: E/AndroidRuntime(628): at org.pjsip.pjsua2.app.MyApp.<clinit>(MyApp.java:235) 

Wydaje się Appl nie może załadować libpjsua2.so bibliotekę. Nigdy wcześniej nie używałam NDK, więc nie mam żadnych pomysłów na ten temat, pomóż mi ...

+0

Możliwy duplikat [jak używać mkfifo używając Androida NDK] (http://stackoverflow.com/questions/27091001/how-to-use-mkfifo-using-androids-ndk). – jww

+0

[Słabe symbole] (http://en.wikipedia.org/wiki/Weak_symbol) powinny być w stanie rozwiązać ten problem. Ale nie jestem przekonany, czy działają na systemie Android, mimo że Android definiuje '__GXX_WEAK__' w preprocesorze. Zobacz [Różne zachowanie słabej funkcji przesłaniania w bibliotece współdzielonej między OS X i Androidem] (http://stackoverflow.com/q/20196368/608639) i [Czy Android obsługuje słabe symbole?] (Http://stackoverflow.com/ q/27935228/608639). – jww

Odpowiedz

28

Dzieje się tak, jeśli masz wbudowane komponenty natywne z celem android-21, ale próbujesz uruchomić to na urządzeniu ze starszą wersją Androida. Jeśli nie zachowasz szczególnej ostrożności, nie możesz uruchamiać plików binarnych zbudowanych z urządzeniem docelowym android-21 na starszych urządzeniach. W przypadku podstawowych funkcji języka C, nie powinno mieć znaczenia, która wersja docelowa będzie używana między android-3 i android-20, powinna działać na wszystkich z nich, ale jeśli używasz android-21, działa tylko na tej i nowszej wersji.

Aby uzyskać więcej informacji na ten temat, zobacz artykuł https://stackoverflow.com/a/27093163/3115956.

+0

"Dla podstawowych funkcji C nie powinno to mieć znaczenia ..." To głównie prawda, ale wiele, jeśli funkcje były zdefiniowane jako wbudowane i teraz promowaliśmy je do właściwych symboli. Nie masz pełnej listy pod ręką, ale iirc 'rand' był jednym z nich. –

+0

Tak, mój komentarz oznaczał, że normalne funkcje C, które rzeczywiście zmieniły się w Androidzie-21, nie zmieniły się między Androidem 3 a Androidem-20. Możesz więc łatwo budować przy użyciu nagłówków Android-20 (lub android-9), np. jeśli chcesz mieć warunkowo używaną ścieżkę kodową, która używa OpenSL ES (ładowana dynamicznie przy użyciu dlsym lub wbudowana w osobne .so), a jednocześnie może działać na Android-3. – mstorsjo

+0

Przykładowa aplikacja dla Androida do PJSIP ma docelową wersję SDK w wersji 15 i próbuję uruchomić na emulatorze AVD z interfejsem API poziomu 15. Tak więc nie jest to przyczyną źródłową. –

11

mstorsjo odpowiada na moje pytanie. Ale chcę napisać jeden komentarz: miałem odpowiednie pliki właściwości, ale podczas budowy PJSIP znalazłem następujące dzienniki:

[email protected]:~/pjsip/trunk$ ./configure-android 
configure-android: APP_PLATFORM not specified, using android-21 
configure-android: TARGET_ABI not specified, using armeabi 

Więc jeśli chcesz skompilować projekt na jakiejś konkretnej wersji platformowej, trzeba ustawić parametr APP_PLATFORM dla skrypt configure-android.

TARGET_ABI=armeabi-v7a APP_PLATFORM=android-8 ./configure-android --use-ndk-cflags 
+0

Po prostu dodaję APP_PLATFORM = android-19 – JMR

+1

Cool! Ale nie wystarczająco. Przebuduj także wiązania swig. Dla * pjsip-apps/src/swig/* użyj 'make clean && make'. – DenisKolodin

+0

Jak dodać APP_PLATFORM do build.gradle? – Jitendra

3

ja spotkałem to podczas korzystania z telefonu HUAWEI opus i pngquant JNI biblioteki dla Androida. Wreszcie rozwiązaniem jest dodanie w moim pliku źródłowym implementacji funkcji rand, srand i atof. Wtedy problem już minął.

Rozwiązanie od https://github.com/cocos2d/cocos2d-x/issues/15234 Wypróbuj!

static u_long myNextRandom = 1; 

double atof(const char *nptr) 

{ 
    return (strtod(nptr, NULL)); 
} 

int rand(void) 
{ 
    return (int)((myNextRandom = (1103515245 * myNextRandom) + 12345) % ((u_long)RAND_MAX + 1)); 
} 

void srand(u_int seed) 
{ 
    myNextRandom = seed; 
} 
Powiązane problemy