2012-08-29 30 views
6

Actualización a 8b NDK que recibir algún informe de bloqueo (la mayoría de ellos son Galaxy SII con Android 4,03)Android 8b NDK No se puede cargar la biblioteca

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) 

La excepción es causada por un simple System.loadLibrary("main");

Lo que hace ¿significa? cannot locate '__gnu_thumb1_case_uqi'

+0

ejecute su ndk-build con V = 1 y publique la línea de comando para el paso de enlace –

+0

¿Ha tenido algún problema con los dispositivos con sistema operativo! = 4.0.3? – Supahfly

+0

Hola, estoy enfrentando el mismo problema, donde estoy cargando SQLiteDatabase.loadLibs (esto) y me lanza sobre la excepción. Lo cual funciona bien en Android 4.2 y versiones posteriores, pero no funciona en HTC un dispositivo V que tiene v4.0.3, ¡ayúdenme! – Zoombie

Respuesta

2

¿Está compilando para armv7? Si no lo está, intente compilar para armv7.

+0

Estoy compilando también para armv7, y realmente no entiendo por qué escribió acerca de Necessitas Qt Creator – Giuseppe

+1

Porque cometí un error, lo siento :-) Confundí la pregunta con otra en la que se usó Qt Creator. De todos modos, tuve el mismo problema al intentar cargar una biblioteca compilada para armv5 en un dispositivo armv7. La compilación para armv5 hizo que funcionara perfectamente, así que no investigué más, pero pensé que podría ser útil. –

1

Producing optimised NDK code for multiple architectures?

lectura sobre 'brazo' vs 'pulgar' en la respuesta aceptada en el enlace anterior.

a continuación, retirar sus instrucciones de configuración para construir para el pulgar y comprobar que se está construyendo para el brazo ...

O ...

enfermedad hace una suposición ... su orden biblioteca que tener en la cuenta de enlazador en su 'Android.mk'

probar el foro de Google para la búsqueda de NDK ... 'no puede localizar el símbolo' ...

realmente desesperada?

consulte la sección 'Tiempo de ejecución errores' here

6

El __gnu_thumb1_case_uqi es un auxiliar que hace un salto indexada en una mesa interruptor densamente poblado; implementa rápidamente el interruptor. Tienes dos opciones: evitarlo o vincularlo.

Si aumenta un nivel de optimización (utilizando -O3) es posible que no necesite este símbolo. Además, cambiar la CPU puede ser útil además de utilizar las instrucciones thumb2. La compilación con la opción -ffreestanding también puede evitar este símbolo. Si tiene control sobre la instrucción switch, puede reemplazarla con una matriz de indicadores de función.

Esta rutina está dentro de libgcc. Puede vincular estáticamente libgcc. En algún lugar del compilador/SDK de Android, debe haber un libgcc.a. Enlace con libgcc.a, usando -L y -l o use la opción del enlazador -static-libgcc para obtener el código (vea http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html).

Edit: Si no está compilando nada, entonces puede encontrar libgcc.so en su sistema. Puede estar en /lib o /usr/lib o tal vez en algún lugar extraño para dispositivos Android. Agregar el directorio donde se encuentra el libgcc.so a la variable de entorno LD_LIBRARY_PATH también podría solucionar el problema. Tal vez sea desafortunado que Samsung haya lanzado binarios incompatibles y no tenga forma de solucionar el problema si no está compilando su propio código. El libgcc.so correcto puede estar dentro de algo como /usr/lib/thumb para distribuciones multi-lib. No sé mucho sobre las cosas de Davlik, pero la JVM de Android podría no señalar el conjunto correcto de bibliotecas cuando se ejecuta.

+0

Esto aún no me ha solucionado el problema, pero de todos modos es una buena información ... –

+0

Desafortunadamente, NDK no exporta '__gnu_thumb1_case_uqi' en ninguna de sus bibliotecas. –

+0

NDK en sí mismo probablemente esté usando 'biónico'; una libc de google, por lo que libgcc.so probablemente no sea el problema, pero una versión de biblioteca 'biónica' que no lo incluye, probablemente tendría que compilar con un NDK anterior para no tener el símbolo. Creo que la función será la misma en 'biónico' que glibc; una declaración de cambio. –

Cuestiones relacionadas