Dalvik está buscando el archivo .so con extensión '.0' – ¿por qué?

He comenzado a desarrollar una aplicación Android muy simple que consta de tres partes:

  • La aplicación Java en sí
  • Una biblioteca compartida pre-construida (lo llamaremos libfoo )
  • Otra biblioteca compartida que utiliza la biblioteca pre-construida (lo llamaremos libfoowrapper )

El sistema de archivos se parece a esto:

 jni Android.mk libfoo.so foowrapper.c 

El archivo Android.mk contiene los siguientes contenidos:

 LOCAL_PATH := $(call my-dir) #============================== include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libfoo.so include $(PREBUILT_SHARED_LIBRARY) #========================= include $(CLEAR_VARS) LOCAL_MODULE := foowrapper LOCAL_SRC_FILES := foowrapper.c LOCAL_SHARED_LIBRARIES := foo-prebuilt include $(BUILD_SHARED_LIBRARY) 

Cuando construyo la aplicación en Eclipse, las cosas parecen funcionar bien, no se reportan errores. Sin embargo, cuando subo la aplicación a mi Samsung Discover (con Android 4.0.4), obtengo el siguiente error en el registro:

 03-05 21:20:27.859: E/AndroidRuntime(20324): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]: 102 could not load needed library 'libfoo.so.0' for 'libfoowrapper.so' (load_library[1091]: Library 'libfoo.so.0' not found) 

¿Por qué el Dalvik busca un archivo .so.0 lugar de un archivo .so ? ¿Qué cambios debo realizar en mi aplicación para eliminar este error?

Al menos en el mundo de Linux, cada biblioteca compartida tiene un nombre especial llamado soname . El soname tiene el prefijo lib , el nombre de la biblioteca, la frase .so , seguido por un punto y un número de versión que se incrementa cada vez que cambia la interfaz (como una excepción especial, las bibliotecas C de nivel más bajo no empiezan con lib ). Un soname completamente calificado incluye como prefijo el directorio en el que está; En un sistema de trabajo un soname completamente cualificado es simplemente un enlace simbólico al real name la biblioteca compartida.

Cada biblioteca compartida también tiene un real name , que es el nombre de archivo que contiene el código de biblioteca real. El nombre real agrega al sonido un período, un número menor, otro período y el número de la versión. El último período y el número de versión son opcionales. El número menor y el número de versión admiten el control de configuración al permitirle saber exactamente qué versión (es) de la biblioteca está instalada. Tenga en cuenta que estos números pueden no ser los mismos que los números utilizados para describir la biblioteca en la documentación, aunque eso facilita las cosas.

Referencia: Linux Standard Base

Edit: Parece que este no es un problema raro, no han visto ninguna solución real a ella, pero tal vez esto le ayudará a empezar a encontrar algo que funcione para usted.

Problema con LOCAL_SRC_FILES al utilizar PREBUILT_SHARED_LIBRARY https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k

Creación de bibliotecas compartidas no versionadas para android http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/

No se encontró la biblioteca 'libproj.so.0' https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88

  • Android: 'No se pudo cargar Foo: findLibrary returned null'
  • Android ICS 4.0 NDK NewStringUTF se está estrellando la aplicación
  • Cómo utilizar bibliotecas extra * .so en Android Studio y NDK
  • Env-> FindClass función devuelve null
  • UnsatisfiedLinkError (Método nativo no encontrado)
  • ¿Cómo importar correctamente una biblioteca de Android con código JNI?
  • Desbordamiento de ReferenceTable (máx = 512) JNI
  • Devuelve una matriz String en un método JNI
  • Error durante la compilación de la muestra de jni de android: inválido -march = opción: `armv5te '
  • Error de UnsatisfiedLink: Método nativo no encontrado findLibrary devuelto null
  • ¿Cualquier manera simple o fácil de depurar el código de Android NDK?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.