2011-01-18 23 views
14

Estoy escribiendo un proyecto android que tiene una capa nativa que ayuda a la capa Java, y estoy atrapado en un lugar donde cuando intente hacer una System.loadLibrary, está arrojando un error que no puede vincularlo.No se puede dlopen (libsomething.so) No se puede cargar la biblioteca: link_image [1995]: no se pudo vincular libsomething.so

Estoy utilizando Target NDK específico para construir la capa nativa, y luego usando ANT para compilar y crear el apk.

Al ejecutar en el dispositivo me sale el siguiente error.

Incapaz de dlopen (libsomething.so) No se puede cargar la biblioteca: link_image [1995]: No se pudo enlazar libsomething.so

La biblioteca conseguir agrupados en el apk, y es desempaquetado correctamente. Si trato de eliminar la biblioteca manualmente y luego ejecutarla, en realidad arroja esa biblioteca no encontrada. Así que es capaz de encontrar la biblioteca, pero arroja este error, y no puedo averiguar por qué viene este error.

Por favor, ayúdame.

Respuesta

10

Primero encuentre la ubicación del archivo .so. y luego se puede probar:

siguiente ejemplo asume la ubicación de la biblioteca compartida como: /data/data/my.package/lib/libmysharedlibrary.so

try { 
    //System.loadLibrary("mysharedlibrary"); 
    System.load("/data/data/my.package/lib/libmysharedlibrary.so"); 
} catch (UnsatisfiedLinkError use) { 
    Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so"); 
} 
+0

Como dije, la biblioteca está presente en la ubicación requerida. Obtengo un resultado de registro que dice que está intentando cargar la biblioteca, pero al tratar de cargar realmente, me da ese error. Sin embargo, probará este cambio también ... Extrañamente, esta misma aplicación funciona en un dispositivo, pero no en el otro. Y estoy totalmente confundido sobre por qué está sucediendo este comportamiento. – Puneet

+0

¿Se puede actualizar en la ruta del archivo de la biblioteca en ambos dispositivos? – TheCottonSilk

+0

Está empaquetado en apk, por lo que se desempaqueta automáticamente durante la instalación, en el mismo directorio. es decir, /data/data/package/lib/libsomething.so – Puneet

3

También puede encontrar este error al utilizar el método System.load (String pathName) y simplemente pasar libraryName en lugar de completar la ruta a la biblioteca.

Resolución: use System.loadLibrary (String libName) método y ahora pase el libraryName.

3

A veces (la mayoría de las veces!) Su biblioteca requiere otras bibliotecas mencionadas por @musefan. y puede listarlos haciendo readelf -d libs/armeabi/libmy.so. Sin embargo, hay una trampa aquí: dado que Android no tiene ningún mecanismo para controlar la versión de la biblioteca (como en Linux normal tienes liblzma.so.1, liblzma.so.2, etc.) la biblioteca que necesitas está allí (liblzma.so) PERO no tiene algunos símbolos importados por tu biblioteca. Aquí está el ejemplo en vivo: utiliza la función android::ZipFileRO::getEntryInfo ubicada en libutils.so. Todas las versiones de la biblioteca tienen esta función; sin embargo, el PROTOTYPE de la función se modificó a fines de 2010, por lo que la aplicación creada para 4.0.4 NDK no se ejecutará en dispositivos FroYo o GB con el mismo sintomático: dlopen no se puede cargar la biblioteca. Aquí está la receta de cómo detectar estos casos: necesita la carpeta de contenidos os/system/lib en su PC. Puede ser una carpeta descargada desde su dispositivo si es una aplicación de terceros desarrollada o construida si es desarrollador de la plataforma.a continuación, emita el comando arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so y verá algo mentira esto en caso de error
lib_mylib.so: undefined reference to androide :: :: ZipFileRO getEntryInfo (void *, int *, * larga, larga *, * larga, larga *, * de largo) const'`

Cuestiones relacionadas