¿Cómo construir múltiples proyectos en el orden de dependencia correcto con Android NDK?
Tengo una serie de bibliotecas existentes que necesito reutilizar en una aplicación de Android. El diseño es similar a:
\ Libraries \ libOne
\ Libraries \ libTwo [Biblioteca estática]
\ Libraries \ libThree
\ Applications \ MyApplication \ [Aplicación]
libTwo
depende de libOne
, y libThree
depende de libTwo
. ¿Cómo puedo obtener el sistema de compilación para construir todas las bibliotecas en el orden correcto? Estoy tratando de usar Eclipse, pero si es necesario puedo usar la línea de comandos.
Todas estas bibliotecas serán finalmente referenciadas por una aplicación Java (y usarán JNI para interactuar con ellas). ¿Alguna pista sobre cómo configuro los archivos de Android.mk / Application.mk?
He intentado usar BUILD_STATIC_LIBRARY
para libTwo, pero en realidad no produce ningún archivo. Esperaba un archivo libTwo.a
, pero nada se compiló o construyó.
¿Escribo un Android.mk en la aplicación? ¿O un Android.mk para cada proyecto?
- La operación del usuario está esperando que se complete el trabajo de fondo
- Eclipse está intentando construir los archivos en mis directorios .svn ... ¿cómo puedo decirle que se detenga?
- Android Lubuntu - error libGL: no se pudo cargar el controlador: i965
- La aplicación de Android no se inicia desde Eclipse
- Problema de configuración de mockito con eclipse. Da error: java.lang.verifyError
- Después del diálogo "Error de autenticación", ahora EGit ya no solicita el nombre de usuario y la contraseña
- ¿Cómo importar el proyecto de Android Studio en Eclipse?
- Java.lang.VerifyError: Esperando un marco de mapa de pila en el destino de la rama 57
OK, ahora veo su edición, y esto hace posible responder a la pregunta específica.
Debe tener al menos un archivo de Android.mk
para su aplicación si desea utilizar Android NDK para crear su (s) biblioteca (s) nativa (s). Esto no es un requisito, sin embargo. Está bien construirlo a través de Cmake, o una "cadena de herramientas independiente" con makefiles "tradicionales", o con un plugin de MS Visual Studio, o cualquier otra forma. Es el resultado lo que importa. El resultado es un objeto compartido construido con un compilador compatible para un tiempo de ejecución biónico.
Hace que goode tenga sentido colocar la biblioteca en el ${project_root}/libs/armeabi/
(para dispositivos compatibles con ARM v6, otros subdirectorios para x86, MIPS, brazo v7a) para permitir que el constructor APK lo empaque correctamente, Descomprima la versión correcta (compatible con el procesador del dispositivo) en el directorio /data/data/${package_name}/lib
del dispositivo y, finalmente, pueda utilizar System.loadLibrary(short_name)
para usarlo desde Java. Pero también es posible empaquetar el archivo de so
diferente, desempaquetarla manualmente y cargarla desde cualquier lugar del sistema de archivos del dispositivo (siempre que su aplicación tenga permiso para escribir y leer este archivo).
Pero si filtramos casos exóticos, es mucho más cómodo tener un Android.mk en el directorio ${project_root}/jni
. En términos del ndk-build
, cada biblioteca es un MÓDULO independiente, pero los tres se pueden definir en un archivo de Android.mk. Por otro lado, si sus bibliotecas están aisladas (por ejemplo, vienen de terceras partes separadas), probablemente prefieran crear tres archivos de Android.mk. Afortunadamente, ndk-build
no es más que un envoltorio alrededor de gnu make, y la simple declaración include
en Android.mk funciona como en cualquier otro makefiles.
En resumen, es probable que su caso esté cubierto por un simple archivo Applications/MyApplication/ [Application]/jni/Android.mk
:
include ../../Libraries/libOne/Android.mk include ../../Libraries/libTwo/Android.mk include ../../Libraries/libThree/Android.mk
No sé qué dependencia tiene entre libOne y libTwo, pero para libOne el archivo Libraries/libOne/Android.mk
se verá como
LOCAL_PATH = $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libOne LOCAL_SRC_FILES := first.c include $(BUILD_STATIC_LIBRARY)
Y Libraries/libThree/Android.mk
LOCAL_PATH = $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libThree LOCAL_SRC_FILES := third.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo LOCAL_STATIC_LIBRARIES := libOne libTwo include $(BUILD_SHARED_LIBRARY)
Debe ejecutar ndk-build
desde el directorio Applications/MyApplication/ [Application]
, ya sea desde el símbolo del sistema o desde el complemento Eclipse ADT.
Actualizar el mismo puede ser expresado por un archivo jni
en el directorio jni
:
LOCAL_PATH = ../../Libraries/libOne include $(CLEAR_VARS) LOCAL_MODULE := libOne LOCAL_SRC_FILES := first.c include $(BUILD_STATIC_LIBRARY) LOCAL_PATH = ../../Libraries/libThree include $(CLEAR_VARS) LOCAL_MODULE := libThree LOCAL_SRC_FILES := third.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo LOCAL_STATIC_LIBRARIES := libOne libTwo include $(BUILD_SHARED_LIBRARY)
Hay una sección de Android en las propiedades de los proyectos, donde puede editar las dependencias de la biblioteca. Sólo se puede usar si libOne libTwo y libThree están marcadas como bibliotecas en el panel de propiedades.
- Sqlite no pudo leer row 0 col -1 de cursorwindow de cursor en servicio de alarma
- Android Build falla al usar Proguard y Gradle