eclipse - studio - bibliotecas nativas mĂșltiples(mi y de terceros) en Android NDK
ndk en android (2)
Tengo que usar dos bibliotecas nativas: una es mía y la otra es de terceros. Siempre y cuando los use en proyectos separados, todo estuvo bien. Pero ahora Exception Ljava/lang/UnsatisfiedLinkError
la Exception Ljava/lang/UnsatisfiedLinkError
.
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 construirse? Las bibliotecas son independientes.
El NDK permite enlazar con bibliotecas de usuario preconstruidas, usando la variable PREBUILT_SHARED_LIBRARY.
Suponiendo que la biblioteca que necesita vincular es librandom.so, cree una carpeta libs
en la subcarpeta jni
de la carpeta del proyecto:
mkdir -p jni/libs
cp librandom.so jni/libs
Luego, solo crea un 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 jni/libs
, todas ubicadas en jni/libs
.
Luego, solo necesita incluir el archivo anterior en su jni / Android.mk para que las cosas funcionen. En los documentos NDK, se recomienda que esto se haga al final de Android.mk, en lugar de en el medio:
include $(LOCAL_PATH)/libs/Android.mk
Sin embargo, deberá hacer esto antes del 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
Luego, cuando hagas ndk-build, copiará esta biblioteca en libs/armeabi/
antes de libs/armeabi/
el módulo, y ya estás listo.
Nota: Esto no resuelve los problemas con los encabezados requeridos. Aún deberá agregar la ubicación de los encabezados de la biblioteca en la variable LOCAL_C_INCLUDES
en el módulo que lo requiere.
Esto es lo que he hecho por el momento. No aceptaré (en el sentido ) mi propia (esta) respuesta porque es insatisfactoria.
Creé un nuevo proyecto y copié todos los archivos java allí. 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.