¿Cómo compilar una biblioteca estática usando Android NDK?


Estoy tratando de compilar una biblioteca estática para usar en Android, pero no puedo averiguar cómo compilarla. La biblioteca utiliza bibliotecas estándar (stdio.h etc...) y libxml2.

Estoy intentando compilar usando arm-eabi-gcc pero obtengo 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 hay tal archivo o directorio

¿Cómo hago que esto funcione?

Author: RzR, 2010-05-31

3 answers

Según lo entiendo, el método correcto es usar ndk-build y no invocar directamente al compilador.

En Android.mk debe especificar un módulo para cada biblioteca estática que desee compilar, y luego especificar que su biblioteca compartida debe usarlo.

Ejemplo de una modificación Android.mk archivo 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 Application.mk archivo (en el mismo directorio que Android.mk) y enumere todos los módulos como en el siguiente ejemplo:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
 45
Author: Reimund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-02 11:54:00

En respuesta a

Puede generar una biblioteca estática (.un archivo) sin una biblioteca compartida ¿que lo usa?

(que realmente debería haber sido su propia pregunta), la respuesta es sí.

De forma predeterminada, el NDK solo construirá ejecutables y bibliotecas compartidas (con sus dependencias, por supuesto). Sin embargo, puede forzar al NDK a crear una biblioteca estática independiente haciendo referencia explícita a ella en su Application.mk.

Asumiendo su módulo de biblioteca estática is LOCAL_MODULE: = libXYZ, añade la siguiente línea a Application.mk (crear 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 el nombre de su módulo de biblioteca estática.

Alternativamente, si no desea crear un Application.mk, puede especificar el valor en la línea de comandos: ndk-build APP_MODULES=XYZ

 8
Author: adelphus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-04 12:59:56

Un truco fresco: si usted tiene un Android.mk archivo, puede cambiar el tipo de compilación desde:

include $(BUILD_SHARED_LIBRARY)

A

include $(BUILD_STATIC_LIBRARY)

Y .las bibliotecas serán enviadas a la carpeta obj / en sus respectivas arquitecturas cuando ndk-build la biblioteca.

 2
Author: Lake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-18 03:18:27