2014-12-07 27 views
21

Sto provando ad usare la libreria PJSIP per la mia applicazione Android. Ho costruito pjsua applicazione di esempio secondo questo manuale: https://trac.pjsip.org/repos/wiki/Getting-Started/AndroidImpossibile caricare la libreria: reloc_library [1285]: impossibile trovare 'rand'

Ma quando applicazione di esempio sta lanciando, ad eccezione innesca:

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) 

Sembra che appl non può caricare libpjsua2.so biblioteca. Non ho mai usato l'NDK prima, quindi non ho idee su questo problema, per favore aiutami ...

+0

Eventuali duplicati di [come utilizzare mkfifo usando NDK Android] (http://stackoverflow.com/questions/27091001/how-to-use-mkfifo-using-androids-ndk). – jww

+0

[I simboli deboli] (http://en.wikipedia.org/wiki/Weak_symbol) dovrebbero essere in grado di risolvere questo problema. Ma non sono convinto che funzionino su Android, anche se Android definisce '__GXX_WEAK__' nel preprocessore. Vedi [Comportamento diverso della funzione di override debole nella libreria condivisa tra OS X e Android] (http://stackoverflow.com/q/20196368/608639) e [L'Android supporta simboli deboli?] (Http://stackoverflow.com/ q/27935228/608.639). – jww

risposta

28

Questo succede se hai creato i tuoi componenti nativi con il target android-21, ma stai provando ad eseguire su un dispositivo con una versione precedente di Android. A meno che non si prenda particolare cura, non è possibile eseguire binari creati con il target android-21 su dispositivi meno recenti. Per le funzioni di base C, non importa quale versione di destinazione tra android-3 e android-20 si utilizza, dovrebbe funzionare su tutti, ma se si utilizza android-21 funziona solo su quella versione e più recente.

Vedere https://stackoverflow.com/a/27093163/3115956 per ulteriori dettagli su questo problema.

+0

"Per le funzioni di base di C non dovrebbe importare ..." Questo è principalmente vero, ma molto se le funzioni erano definite come inline e ora le abbiamo promosse a simboli corretti. Non ho una lista completa a portata di mano, ma iirc 'rand' era uno di questi. –

+0

Sì, il mio commento significava che le normali funzioni C che effettivamente cambiano in Android-21, non hanno avuto alcun cambiamento tra Android-3 e Android-20. Quindi puoi facilmente costruire usando le intestazioni android-20 (o android-9), ad es. se si desidera avere un codepath condizionato che utilizza OpenSL ES (caricato dinamicamente con dlsym, o incorporato in un file .so separato) mentre è ancora in grado di girare su android-3. – mstorsjo

+0

L'applicazione di esempio Android per PJSIP ha come target SDK versione 15 e sto provando a lanciare su emulatore AVD con livello API 15. Quindi non è la causa principale. –

11

mstorsjo risponde alla mia domanda. Ma voglio scrivere un commento: avevo corretti file di proprietà, ma durante edificio PJSIP ho trovato seguenti registri:

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

Quindi, se si vuole compilare il progetto su alcune specifiche versione della piattaforma, è necessario impostare il parametro APP_PLATFORM per configure-android script.

+0

Aggiungo semplicemente APP_PLATFORM = android-19 – JMR

+1

Cool! Ma non abbastanza. Ricostruisci anche i binding swig. Per * pjsip-apps/src/swig/* usa 'make clean && make'. – DenisKolodin

+0

Come aggiungere APP_PLATFORM in build.gradle? – Jitendra

3

Ho riscontrato questo quando si utilizza il telefono HUAWEI con libreria opus e pngquant jni per Android. Infine la soluzione è che aggiungo rand, srand e atof implementazioni di funzioni nel mio file sorgente. Quindi il problema è andato.

Soluzione da https://github.com/cocos2d/cocos2d-x/issues/15234 Provalo!

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; 
} 
Problemi correlati