2012-04-28 30 views
5

Tengo que usar dos bibliotecas nativas: una es la mía y la otra es de terceros. Siempre y cuando los use en proyectos separados, todo estuvo bien. Pero ahora obtengo el Exception Ljava/lang/UnsatisfiedLinkError.bibliotecas nativas múltiples (mi y de terceros) en Android NDK

Estoy usando Eclipse.

Descubrí que si coloco la biblioteca existente en libs/armeabi, Eclipse comienza la compilación del código nativo y falla. Si reconstruyo la parte JNI desde la línea de comando, la compilación tiene éxito pero la biblioteca de terceros desaparece. Realmente estúpido.

Entonces, ¿cómo le digo a Eclipse que use una biblioteca .so existente junto con una biblioteca que debe compilarse? Las bibliotecas son independientes.

Respuesta

7

El NDK permite enlazar con bibliotecas de usuario preconstruidas, utilizando la variable PREBUILT_SHARED_LIBRARY.

Suponiendo que la biblioteca es necesario enlazar es librandom.so, crear una carpeta en libsjni subcarpeta de la carpeta del proyecto:

mkdir -p jni/libs 
cp librandom.so jni/libs 

A continuación, basta con crear un archivo jni/libs/Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 

Puede crear una sección para cada biblioteca preconstruida, todas ubicadas en jni/libs.

A continuación, solo tiene que incluir el archivo anterior en su jni/Android.mk para que las cosas funcionen. En los documentos de NDK, se recomienda que esto se haga al final de la Android.mk, en lugar de la media:

include $(LOCAL_PATH)/libs/Android.mk 

Sin embargo, tendrá que hacerlo antes de que el módulo que requiere esta biblioteca.

Para vincular, deberá agregar lo siguiente en la sección del módulo que enlaza con la biblioteca precompilada.

LOCAL_SHARED_LIBRARIES := random 

Entonces cuando lo hace NDK-construcción, copiará esta biblioteca en libs/armeabi/ antes de construir el módulo, y ya está bueno para ir.

Nota: Esto no resuelve los problemas con los encabezados necesarios. Aún necesitará agregar la ubicación de los encabezados para la biblioteca en la variable LOCAL_C_INCLUDES en el módulo que lo requiera.

+0

ACTUALIZACIÓN: si una biblioteca depende de otra, ver http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared-libraries-calling-each-other – 18446744073709551615

3

Esto es lo que he hecho por el momento. No aceptaré (en el sentido stackoverflow) mi propia (esta) respuesta porque es insatisfactoria.

He creado un nuevo proyecto y he copiado allí todos los archivos java. Luego, copié la biblioteca .so del proyecto anterior y la biblioteca de terceros en libs/armeabi.

Eso es monstruoso. Pero funciona. Por el momento. Lo peor es que el control de la versión está torpedeado.