¿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?

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.

  • Android sdk Content Loader ha encontrado un problema
  • Un dispositivo virtual Android que no se pudo cargar. Haga clic en 'detalles' para ver el error
  • Error de Android: abierto fallido ENOENT
  • ¿Estancado en la pantalla del emulador en Eclipse con Android Development?
  • Magic detrás del archivo R.java
  • Tener un proyecto de blackberry J2ME y Android bajo Eclipse
  • Renombrar completamente un proyecto en Eclipse
  • Eclipse no puede encontrar adb
  • No se encuentra la biblioteca de soporte de preferencias v7 en Eclipse ADT
  • Después de quitar el apk, cada vez que comienzo Debug me dice que el paquete no está instalado
  • Cómo depurar vista personalizada en el Editor de diseño gráfico de ADT
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.