La librería NDK de Android no se carga en tiempo de ejecución para los teléfonos samsung galaxy 4.0.2
Estoy intentando probar mi programación de NDK en diversos teléfonos. La misma aplicación se ejecuta en todos los demás teléfonos, pero en samsung 4.0.2 sólo se detiene, lanzando el siguiente error. ¿Estoy perdiendo algo? Cualquier ayuda es apreciada
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.Activity.performCreate(Activity.java:4486) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.access$600(ActivityThread.java:127) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.os.Handler.dispatchMessage(Handler.java:99) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.os.Looper.loop(Looper.java:137) 10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.main(ActivityThread.java:4511) 10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.reflect.Method.invokeNative(Native Method) 10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.reflect.Method.invoke(Method.java:511) 10-29 12:02:57.729: E/AndroidRuntime(3626): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976) 10-29 12:02:57.729: E/AndroidRuntime(3626): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743) 10-29 12:02:57.729: E/AndroidRuntime(3626): at dalvik.system.NativeStart.main(Native Method) **10-29 12:02:57.729: E/AndroidRuntime(3626): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 161 cannot locate '__aeabi_idiv0'...** 10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.Runtime.loadLibrary(Runtime.java:370) 10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.System.loadLibrary(System.java:535)
- Las transacciones siguen acumulándose en el búfer (SDK de Google Analytics para Android)
- Android ScrollView no se inicia en la parte superior, pero al principio del GridView
- Cómo configurar el tamaño del archivo PDF con PdfDocument en Android
- Error de Android aleatoriamente java.lang.NoClassDefFoundError: com.facebook.internal.Utility
- Barra de estado transparente: antes de Android 4.4 (KitKat)
- ¿Cuándo usar ArrayMap de Android en lugar de un HashMap?
- Android Google Maps V2 - Tarjeta Sd como proveedor de mosaico
- La aplicación se bloquea cuando se ejecuta utilizando Google Maps api v2
- SetOnClickListener (nuevo OnClickListener () {})
- Cómo comparar representaciones de cadena de dobles si termina en .00
- Quitar el relleno en la barra de progreso horizontal
- Android: el reproductor de youtube ha sido lanzado
- Cómo convertir el tiempo en AAAA-MM-DDTHH: mm: ss.SSSZ formato a la zona horaria por defecto?
Hay un error conocido en Android 4.0 con la carga de bibliotecas nativas que puede ser la causa de su problema. Escribí un blogpost detallado en él si usted desea zambullirse en los detalles. Larga historia corta:
Supongo que la biblioteca que está intentando utilizar se compila para diferentes arquitecturas (generalmente armeabi y armeabi-v7a, respectivamente almacenadas en libs/armeabi
y libs/armeabi-v7a
). En Android 4.0, el método System.loadLibrary()
está desordenado: al intentar cargar libsomething.so
biblioteca, en lugar de buscar la biblioteca nativa en la carpeta correspondiente a la arquitectura del dispositivo, se carga la primera biblioteca con nombre libsomething.so
se encuentra en cualquier subcarpeta libs
, potencialmente cargando la arquitectura equivocada, que puede causar un accidente.
La solución más sencilla:
- Dar nombres diferentes a las bibliotecas en función de su arquitectura, por ejemplo
libsomething.so
para armeabi ylibsomething-v7a.so
para armeabi-v7a. De esta manera, cuando se utilizaSystem.loadLibrary()
, no puede confundirse por el hecho de que varios archivos tienen el mismo nombre. - Una vez hecho esto, el problema es que usted debe saber cuál de estos dos nombres de archivo cargar con
System.loadLibrary()
, es decir , debe detectar la arquitectura utilizada por el dispositivo por usted mismo. Hay varias maneras de hacer eso: uno de ellos es usar elandroid_getCpuFeatures()
del archivocpu-features.h
de código nativo (explicado en el blogpost anterior), otro es analizar el archivo de sistema/proc/cpuinfo
de Java (Por ejemplo, como se explica aquí )
¡Espero que esto ayude!
- Leer el registro del sistema en Android 4.1
- Faltan los servicios de Google Play en el emulador de Android 2.2 mientras usas Google Maps API v2