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:
- Error de INSTALL_FAILED_MISSING_SHARED_LIBRARY en Android
- Dalvik auto-compilado no carga bibliotecas compartidas
- Enlace de Android NDK
- Compartir una biblioteca de Android entre varias aplicaciones de Android con Gradle
- ¿Cómo construir OpenSSL como biblioteca compartida no versionada para Android?
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
- Referencias indefinidas enlazan una biblioteca compartida pre-construida en Android con NDK
- ¿Cómo agregar una biblioteca dinámica a Android?
- ¿Cómo crear su propia biblioteca para el desarrollo de Android que se utilizará en cada programa que escriba?
- Reutilización de la biblioteca compartida del brazo
- Android - No se pudo encontrar google-play-services_lib.apk! error
- Errores de coincidencia de tar cuando agrega biblioteca en eclipse
- Cargando bibliotecas compartidas de terceros desde una actividad nativa de Android
- Integración de una biblioteca Java externa externa y acceso a clases de Android en ella
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
-
¿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 paquetecom.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, ...)
-
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 …
- Reaccionar-nativo: app: installDebug FALLA
- Cadena de decodificación codificada en formato utf-8 en android