2012-08-29 2 views
6

Mise à niveau vers NDK 8b Je reçois un certain rapport d'accident (la plupart d'entre eux sont Galaxy SII avec Android 4,03)Android NDK 8b Impossible de charger la bibliothèque

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'exception est causée par une simple System.loadLibrary("main");

Qu'est-ce que CA veut dire? cannot locate '__gnu_thumb1_case_uqi'

+0

veuillez exécuter votre ndk-build avec V = 1 et afficher la ligne de commande pour l'étape de liaison –

+0

Avez-vous eu un problème avec les périphériques avec OS! = 4.0.3? – Supahfly

+0

Salut, je suis confronté au même problème, où je charge SQLiteDatabase.loadLibs (this) et il me jette sur l'exception. Ce qui fonctionne bien dans Android 4.2 et supérieur, mais ne fonctionne pas dans HTC One V dispositif ayant v4.0.3, s'il vous plaît aider !! – Zoombie

Répondre

2

Compilez-vous pour armv7? Si ce n'est pas le cas, essayez de compiler pour armv7.

+0

Je compile aussi pour armv7, et je ne comprends vraiment pas pourquoi vous avez écrit sur le Necessitas Qt Creator – Giuseppe

+1

Parce que j'ai fait une erreur, désolé :-) J'ai confondu la question avec une autre dans laquelle Qt Creator a été utilisé. Quoi qu'il en soit, j'ai eu le même problème en essayant de charger une bibliothèque compilée pour armv5 sur un périphérique armv7. Compiler pour armv5 a fait fonctionner parfaitement, donc je n'ai pas enquêté plus loin, mais j'ai pensé que cela pourrait aider. –

1

Producing optimised NDK code for multiple architectures?

lecture de « bras » vs « pouce » dans la réponse acceptée dans le lien ci-dessus.

puis, retirez vos instructions de configuration pour construire pour le pouce et vérifiez que vous construisez pour le bras ...

OU ...

mal faire une conjecture sauvage ... son l'ordre de la bibliothèque vous ont dans l'instruction éditeur de liens dans votre « Android.mk »

essayer le forum Google pour NDK ... la recherche de « ne peut pas localiser le symbole » ...

vraiment désespérée?

voir la section here

6
'erreurs d'exécution de

Le __gnu_thumb1_case_uqi est une aide qui fait un saut indexé sur une table de commutation dense; implémente rapidement le commutateur. Vous avez deux options: l'éviter ou le lier avec.

Si vous augmentez le niveau d'optimisation (en utilisant -O3), vous n'aurez peut-être pas besoin de ce symbole. En outre, le changement de la CPU peut aider ainsi que l'utilisation des instructions thumb2. Compiler avec l'option -ffreestanding peut également éviter ce symbole. Si vous avez le contrôle sur l'instruction switch, vous pouvez la remplacer par un tableau de pointeurs de fonction. Cette routine est à l'intérieur libgcc. Vous pouvez lier statiquement libgcc. Quelque part dans le SDK/compilateur Android, il doit y avoir un libgcc.a. Liez avec libgcc.a, en utilisant -L et -l ou utilisez l'option de l'éditeur de liens -static-libgcc pour obtenir le code (voir http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html).

Éditer: Si vous ne compilez rien, alors vous pouvez trouver libgcc.so sur votre système. Il pourrait être dans /lib ou /usr/lib ou peut-être un endroit étrange pour les appareils Android. Ajout du répertoire où le libgcc.so est situé à la variable d'environnement LD_LIBRARY_PATH pourrait également résoudre le problème. Il est peut-être regrettable que Samsung ait publié des binaires incompatibles et que vous n'ayez aucun moyen de résoudre le problème si vous ne compilez pas votre propre code. La bonne libgcc.so peut-être à l'intérieur de quelque chose comme /usr/lib/thumb pour les distributions multi-lib. Je ne connais pas grand-chose à Davlik, mais la JVM Android pourrait ne pas pointer sur le bon ensemble de bibliothèques quand il s'exécute.

+0

Cela n'a pas encore résolu le problème pour moi, mais c'est néanmoins une bonne information ... –

+0

Malheureusement, NDK n'exporte pas '__gnu_thumb1_case_uqi' dans aucune de ses bibliothèques. –

+0

NDK par lui-même utilise probablement 'bionic'; une libc google, donc libgcc.so n'est probablement pas le problème, mais une version de la bibliothèque 'bionic' qui ne l'inclut pas, vous devrez probablement construire avec un ancien NDK pour ne pas avoir le symbole. Je pense que la fonction sera la même dans 'bionic' que glibc; une déclaration de commutateur. –

Questions connexes