2012-08-29 1 views
6

Aggiornamento a NDK 8b ricevo qualche relazione crash (la maggior parte di loro sono Galaxy SII con Android 4,03)Android NDK 8b Impossibile caricare la libreria

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 1836 cannot locate '__gnu_thumb1_case_uqi'... 
at java.lang.Runtime.loadLibrary(Runtime.java:370) 
at java.lang.System.loadLibrary(System.java:535) 
at com.iuculano.fplayer.SDLActivity.void onCreate(android.os.Bundle)(SourceFile:324) 
at android.app.Activity.performCreate(Activity.java:4465) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
at android.app.ActivityThread.access$600(ActivityThread.java:127) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4507) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
at dalvik.system.NativeStart.main(Native Method) 

L'eccezione è causata da un semplice System.loadLibrary("main");

Cosa fa significa? cannot locate '__gnu_thumb1_case_uqi'

+0

esegui il tuo ndk-build con V = 1 e pubblica la riga di comando per il passaggio del collegamento –

+0

Hai riscontrato problemi con i dispositivi con sistema operativo! = 4.0.3? – Supahfly

+0

Ciao, sto affrontando lo stesso problema, dove sto caricando SQLiteDatabase.loadLibs (questo) e mi getta su un'eccezione. Che funziona bene in Android 4.2 e versioni successive, ma non funziona su HTC one V con v4.0.3, per favore aiutatemi !! – Zoombie

risposta

2

Stai compilando per armv7? Se non lo sei, prova a compilare per armv7.

+0

Sto compilando anche per armv7, e davvero non capisco perché hai scritto sul Necessitas Qt Creator – Giuseppe

+1

Perché ho fatto un errore, scusa :-) Ho confuso la domanda con un'altra in cui è stato usato Qt Creator. Ad ogni modo, ho avuto lo stesso esatto problema quando provavo a caricare una libreria compilata per armv5 su un dispositivo armv7. La compilazione per armv5 ha funzionato perfettamente, quindi non ho indagato ulteriormente, ma ho pensato che potesse essere d'aiuto. –

1

Producing optimised NDK code for multiple architectures?

lettura di 'armare' vs 'pollice' nella risposta accettata nel link qui sopra.

quindi, rimuovere le istruzioni di configurazione di costruire per il pollice e verificare che si sta costruendo per il braccio ...

O ...

malata fare un ipotesi ... la sua l'ordine libreria che si avere nella dichiarazione linker nel vostro 'Android.mk'

provare il forum di Google per NDK ... alla ricerca di 'non può individuare il simbolo' ...

davvero disperata?

Vedere la sezione '' errori di runtime here

6

Il __gnu_thumb1_case_uqi è un aiutante, che fa un salto indicizzato su un tavolo interruttore densamente; implementa rapidamente l'interruttore. Hai due opzioni: evitalo o collegalo.

Se si aumenta un livello di ottimizzazione (utilizzando -O3), potrebbe non essere necessario questo simbolo. Inoltre, cambiare la CPU può essere d'aiuto e usare le istruzioni thumb2. La compilazione con l'opzione -ffreestanding può anche evitare questo simbolo. Se si ha il controllo sull'istruzione switch, è possibile sostituirlo con una serie di puntatori di funzione.

Questa routine è all'interno di libgcc. È possibile collegare staticamente libgcc. Da qualche parte nel SDK/compilatore di Android, ci deve essere un libgcc.a. Collegamento con libgcc.a, utilizzando -L e -l o utilizzare l'opzione di collegamento -static-libgcc per ottenere il codice (vedere http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html).

Modifica: Se non si sta compilando nulla, è possibile trovare libgcc.so sul proprio sistema. Potrebbe essere in /lib o /usr/lib o forse un posto strano per i dispositivi Android. Aggiungere la directory in cui si trova il libgcc.so alla variabile di ambiente LD_LIBRARY_PATH potrebbe risolvere il problema. Forse è un peccato che Samsung abbia rilasciato binari incompatibili e non hai modo di risolvere il problema se non stai compilando il tuo codice. Il corretto libgcc.so forse all'interno di qualcosa come /usr/lib/thumb per le distribuzioni multi-lib. Non so molto su ciò che riguarda Davlik, ma la JVM Android potrebbe non puntare al giusto insieme di librerie quando viene eseguita.

+0

Questo non ha ancora risolto il problema, ma è comunque una buona informazione ... –

+0

Sfortunatamente, NDK non esporta '__gnu_thumb1_case_uqi' in nessuna delle sue librerie. –

+0

NDK di per sé probabilmente usa "bionico"; una google libc, quindi probabilmente libgcc.so non è il problema, ma una versione di libreria "bionica" che non la include, probabilmente dovresti costruire con un NDK precedente per non avere il simbolo. Penso che la funzione sarà la stessa in "bionic" come glibc; una dichiarazione di commutazione. –