2011-03-14 9 views
12

Estoy intentando crear una biblioteca compartida que se vincule a otra biblioteca compartida.anddroid ndk UnsatisfiedLinkError al usar una biblioteca compartida preconstruida

Aquí es mi módulo principal Android.mk:

TOP_LOCAL_PATH := $(call my-dir) 
include $(call all-subdir-makefiles) 

LOCAL_PATH := $(TOP_LOCAL_PATH) 

include $(CLEAR_VARS) 

LOCAL_CPP_EXTENSION := cpp 


LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib/include 
LOCAL_MODULE := SightCore-jni 
LOCAL_SRC_FILES := SightDemo.cpp SightCore-jni.cpp 
LOCAL_SHARED_LIBRARIES := SightAPI 
LOCAL_LDLIBS = -llog 

include $(BUILD_SHARED_LIBRARY) 

que también tienen la biblioteca compartida en el directorio creado previamente ./lib con su propio archivo Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := SightAPI 
LOCAL_SRC_FILES := libSightAPI.so 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include 

include $(PREBUILT_SHARED_LIBRARY) 

El SightCore- El archivo fuente jni.cpp es la interfaz jni de la biblioteca compartida y se carga con el comando

System.loadLibrary("SightCore-jni"); 

Durante la Proceso ndk-build Me sale sin compilación ni enlaces errores. Cuando intento ejecutar la aplicación y acceder a uno de los métodos nativos obtengo el UnsatsfiedLinkError. Observé que si deshabilitaba las referencias a SightAPI en mi código jni y ponía un error tipográfico en la línea LOCAL_STATIC_LIBRARIES: = SightAPI, la compilación se realizó correctamente y no hay UnsatisfiedLinkError.
Esto significa que el código JNI que tengo es bueno (en realidad estoy seguro de que está bien ...)

Así que la observación es la siguiente:
Si puedo compilar la biblioteca compartida con el pre-compilados biblioteca compartida obtengo un archivo corrupto .so.

Si puedo compilar el mismo proyecto NDK sin vincular a la biblioteca compartida de pre-compilados hay ningún problema cargar la biblioteca compartida desde el lado de Java.

Por favor, ayúdenme si puede.

Gracias de antemano,

Ita

+0

¿Qué mensaje de error ve en logcat? Debería haber un mensaje encima de la excepción UnsatisfiedLinkError, probablemente con salida de dlopen(). Además, ¿qué versión de Android estás usando? – fadden

+0

¿Cómo puedo vincular mi biblioteca compartida al proyecto NDK de Android? ¿Puede explicarme – user1089679

Respuesta

13

Ha encontrado el problema.

Aparentemente, el sistema de compilación ndk no carga automáticamente las bibliotecas compartidas de referencia, incluso si están declaradas en su Android.mk.

Tuve que llamar al System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni") para resolver este problema. Hubiera esperado que la única biblioteca para cargar hubiera sido la biblioteca principal SightCore-jni.

Well..I que la moraleja es que si quieres que algo se haga, hágalo usted mismo :)

1 a Roy Samuel por su esfuerzo y los instintos correctos.

Espero que esto ayude a cualquiera.

Cheers

+0

Tengo que poner este System.loadLibrary (SightAPI) en static {}.? y con "SightAPI"? – user1089679

4
  1. se ha asegurado de que el nombre de la función CPP, que le gustaría usar más de JNI, se corresponde con el nombre del paquete de la envoltura de Java clase donde está presente System.loadLibrary("SightCore-jni");?

    p. Ej. Si desea utilizar la función C, myFunction en la capa de java, y supongamos que la clase contenedora JNI es en el paquete com.my.package.sightcore, entonces su C nombre de la función de código debe ser como este:

    JNIEXPORT JNICALL Java_com_my_package_sightcore_myFunction(JNIEnv * env, jobject thiz, ...) 
    
  2. si está ejecutando su aplicación en su dispositivo, Vea si los niveles de API, y por lo tanto, la versión de sdk coincide con la versión de Android de su dispositivo (nivel de API).

Espero que esto ayude. Avíseme si necesita más aclaraciones ...

+0

? Consulte este excelente tutorial, esto podría ayudar: http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by -step/ –

+0

qué sucede si tenemos un archivo .so que en primer lugar no fue diseñado para ser utilizado en el entorno JNI. El método de esta biblioteca no tendría la convención de nomenclatura creada por el comando javah de aplicar el nombre del paquete y el nombre de la clase a la función. ¿Cómo funcionaría esto? Gracias – Thiago

+0

Hasta donde yo sé, si el archivo .so no tiene la convención de nomenclatura correcta, es decir, el esquema de nombres JNI, no se "exportará" al nivel de java. Por lo tanto, no puede ser utilizado. Tendrá que obtener la fuente de esta biblioteca y compilarla con la convención de nomenclatura correcta, para que pueda ser visible para su uso en la capa de Java. Espero que esto ayude. –

Cuestiones relacionadas