android - r17b - ndk r13
¿Cómo compilar una biblioteca estática usando el NDK de Android? (3)
En respuesta a
¿Se puede generar una biblioteca estática (archivo .a) sin una biblioteca compartida que la use?
(que realmente debería haber sido su propia pregunta), la respuesta es sí.
Por defecto, el NDK solo compilará ejecutables y bibliotecas compartidas (con sus dependencias, por supuesto). Sin embargo, puede obligar al NDK a crear una biblioteca estática independiente al hacer referencia explícita en su Application.mk.
Suponiendo que su módulo de biblioteca estática es LOCAL_MODULE: = libXYZ, agregue la siguiente línea a Application.mk (creando el archivo en la misma carpeta que su Android.mk si no existe):
APP_MODULES := XYZ
Tenga en cuenta que el valor APP_MODULES no incluye el prefijo lib incluido en su nombre de módulo de biblioteca estática.
Alternativamente, si no desea crear una Application.mk, puede especificar el valor en la línea de comando: ndk-build APP_MODULES=XYZ
Estoy tratando de compilar una biblioteca estática para usar en Android, pero no puedo averiguar cómo compilarla. La biblioteca usa librerías estándar (stdio.h etc ...) y libxml2.
Estoy intentando compilar usando arm-eabi-gcc, pero me sale el siguiente error:
/cygdrive/c/android-ndk-r4/build/platforms/android-8/arch-x86/usr/include/asm/posix_types.h:15:28: error: posix_types_64.h: no existe dicho archivo o directorio
¿Cómo hago que esto funcione?
Según tengo entendido, el método correcto es usar ndk-build y no invocar el compilador directamente.
En Android.mk necesita especificar un módulo para cada biblioteca estática que desea compilar, y luego especificar que su biblioteca compartida debería usarlo.
Ejemplo de un archivo Android.mk modificado del proyecto de ejemplo hello-jni:
LOCAL_PATH := $(call my-dir)
# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := <list_of_src_files>
# Optional compiler flags.
LOCAL_LDLIBS = -lz -lm
LOCAL_CFLAGS = -Wall -pedantic -std=c99 -g
include $(BUILD_STATIC_LIBRARY)
# First lib, which will be built statically.
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_STATIC_LIBRARIES := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Si desea controlar qué módulos compilar cuando ejecuta ndk-build, puede crear crear un archivo Application.mk (en el mismo directorio que Android.mk) y enumerar todos los módulos como en el siguiente ejemplo:
APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
Un truco genial: si tienes un archivo Android.mk, puedes cambiar el tipo de compilación desde:
include $(BUILD_SHARED_LIBRARY)
a
include $(BUILD_STATIC_LIBRARY)
y las bibliotecas .a saldrán a la carpeta obj / en sus respectivas arquitecturas cuando construya ndk-build la biblioteca.