Android ndk UnsatisfiedLinkError al usar una biblioteca compartida precompuesta

Estoy intentando crear una biblioteca compartida que enlace a otra biblioteca compartida.

Aquí está 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) 

También tengo la biblioteca compartida prebuilt en ./lib directorio con su propio archivo de 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 archivo fuente SightCore-jni.cpp es la interfaz jni de la biblioteca compartida y se carga con el comando

 System.loadLibrary("SightCore-jni"); 

Durante el proceso ndk-build no obtengo errores de compilación o vinculación . Cuando intento funcionar con la aplicación y tener acceso a uno de los métodos nativos consigo el UnsatsfiedLinkError. Me di cuenta de que si deshabilitar las referencias a la SightAPI en mi código jni y poner un error tipográfico a la LOCAL_STATIC_LIBRARIES: = SightAPI línea, La construcción es exitosa y no hay UnsatisfiedLinkError .
Esto significa que el código jni que tengo es bueno (estoy realmente seguro de que está bien …)

Así que la observación es la siguiente:
Si compile la biblioteca compartida con la biblioteca compartida pre-construida consigo un archivo .so dañado .

Si compile el mismo proyecto ndk sin enlazar con la biblioteca compartida precompuesta , no hay ningún problema al cargar la biblioteca compartida desde el lado de java.

Por favor, ayúdame si puedes.

Gracias por adelantado,

Ita

Encontrado el problema.

Al parecer, el sistema de compilación ndk no carga automáticamente las bibliotecas compartidas referenciadas , incluso si se declaran en su Android.mk.

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

Bueno .. Supongo que la moral es Si quieres algo hecho, hazlo tú mismo 🙂

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

Espero que esto ayude a cualquiera.

Aclamaciones

  1. ¿Se ha cerciorado de que el nombre de la función cpp, que desea utilizar sobre JNI, corresponde al nombre del paquete de la clase de contenedor Java donde se encuentra System.loadLibrary("SightCore-jni"); ¿está presente?

    Por ejemplo, si desea utilizar la función C, myFunction en la capa java, y suponga que su clase de contenedor JNI está en el paquete com.my.package.sightcore , el nombre de su función de código C debe ser así:

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

Espero que esto ayude. Déjeme saber si necesita más aclaraciones …

  • Construir biblioteca compartida enlazando a otras bibliotecas no estándar compartidas
  • Cómo cargar un objeto compartido nativo, en un tarro, de una aplicación de Android?
  • Uso de archivos .so en Android Studio
  • Phonegap 3.3 Eclipse: Proyecto -CordovaLib falta las propiedades de Android
  • Eclipse "\ Android Private Libraries" vs "\ Referenced Libraries"
  • Vinculación con la biblioteca compartida versionada en Android NDK
  • Android - ¿Cómo cargar la biblioteca compartida?
  • ¿Cómo usar las bibliotecas nativas de android en Java usando eclipse?
  • Construye la librería Android-openssl para la plataforma 2.1
  • Cómo usar una biblioteca compartida en la actividad nativa
  • ¿No se pudo enlazar libstlport_shared, aunque esté presente ...?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.