ndk-build

La secuencia de comandos ndk-build compila proyectos que utilizan el sistema de compilación basado en Make del NDK. Existe documentación más específica sobre la configuración de Android.mk y Application.mk que utiliza ndk-build.

Aspectos internos

La ejecución de la secuencia de comandos ndk-build es equivalente a ejecutar el siguiente comando:

    $GNUMAKE -f <ndk>/build/core/build-local.mk
    <parameters>
    

$GNUMAKE apunta a Make 3.81 o versiones posteriores de GNU, y <ndk> apunta a tu directorio de instalación del NDK. Puedes usar esta información para invocar ndk-build desde otras secuencias de comandos de shell, e incluso desde tus propios archivos make.

Cómo realizar invocaciones desde la línea de comandos

La secuencia de comandos ndk-build se encuentra en el nivel superior del directorio de instalación del NDK. Para ejecutarla desde la línea de comandos, invócala mientras te encuentras en el directorio del proyecto de tu aplicación o debajo de este. Por ejemplo:

    $ cd <project>
    $ <ndk>/ndk-build
    

En este ejemplo, <project> apunta al directorio raíz de tu proyecto, y <ndk> es el directorio donde instalaste el NDK.

Opciones

Todos los parámetros de ndk-build se pasan directamente al comando make subyacente de GNU que ejecuta las secuencias de comandos de compilación del NDK. Combina ndk-build y opciones en el formulario ndk-build <option>. Por ejemplo:

    $ ndk-build clean
    

Están disponibles las siguientes opciones:

clean
Quita los objetos binarios generados anteriormente.

Nota En Mac OS X, si se ejecuta ndk-build clean con un alto número de ejecuciones paralelas, es posible que aparezca un error de compilación que incluya el siguiente mensaje:

    rm: fts_read: No such file or directory
    

Para evitar este problema, procura no usar el modificador -jN ni seleccionar un valor inferior para N, como "2".

V=1
Inicia la compilación y muestra los comandos de compilación.
-B
Fuerza una nueva compilación.
-B V=1
Fuerza una nueva compilación y muestra los comandos de compilación.
NDK_LOG=1
Muestra mensajes de registros internos del NDK (empleados para depurarlo).
NDK_DEBUG=1
Fuerza una compilación depurable (consulta la tabla 1).
NDK_DEBUG=0
Fuerza una compilación de versión (consulta la tabla 1).
NDK_HOST_32BIT=1
Usa siempre la cadena de herramientas en modo de 32 bits (consulta Cadenas de herramientas de 64 bits y de 32 bits).
NDK_APPLICATION_MK=<file>
Compila con un archivo Application.mk específico al que apunta la variable NDK_APPLICATION_MK.
-C <project>
Compila el código nativo para la ruta de acceso al proyecto ubicado en <project>. Es útil si no deseas usar el comando cd para el directorio en la terminal.

Compilaciones depurables frente a compilaciones de versión

Usa la opción NDK_DEBUG y, en determinados casos, AndroidManifest.xml para especificar la compilación de depuraciones o actualizaciones, el comportamiento relacionado con la optimización y la inclusión de símbolos. En la tabla 1 se muestran los resultados de cada combinación de configuraciones posible.

Tabla 1: Resultados de combinaciones de NDK_DEBUG (línea de comandos) y android:debuggable (manifiesto)

Configuración de manifiestoNDK_DEBUG=0NDK_DEBUG=1NDK_DEBUG no especificado
android:debuggable="true" Depuración; Símbolos; Optimizada*1Depuración; Símbolos; Sin optimizar*2(igual que NDK_DEBUG=1)
android:debuggable="false"Versión; Símbolos; OptimizadaVersión; Símbolos; Sin optimizarVersión; Sin símbolos, Optimizada*3

*1: Es útil para el perfilamiento.
*2: Es el modo predeterminado para ejecutar ndk-gdb.
*3: Es el modo predeterminado.

Nota: NDK_DEBUG=0 es el equivalente de APP_OPTIM=release y se compila con -O2. NDK_DEBUG=1 es el equivalente de APP_OPTIM=debug en Application.mk y se compila con -O0. Para obtener más información sobre APP_OPTIM, consulta Application.mk.

La sintaxis de la línea de comando es, por ejemplo:

    $ ndk-build NDK_DEBUG=1
    

Conjuntos de herramientas de 64 y 32 bits

Algunos conjuntos de herramientas vienen con ambas versiones, la de 64 y la de 32 bits. Por ejemplo, los directorios <ndk>/toolchain/<name>/prebuilt/ y <ndk>/prebuilt/ pueden contener tanto carpetas linux-x86 como linux-x86_64 para herramientas de Linux en modos de 32 y 64 bits, respectivamente. La secuencia de comandos ndk-build selecciona automáticamente una versión de 64 bits de la cadena de herramientas si el SO la admite. Puedes forzar el uso de una cadena de herramientas de 32 bits usando NDK_HOST_32BIT=1 ya sea en tu entorno o en la línea de comandos ndk-build.

Ten en cuenta que las herramientas de 64 bits usan mejor los recursos del host (por ejemplo, son más rápidas y admiten programas más grandes) y pueden, de todos modos, generar objetos binarios de 32 bits para Android.

Requisitos

Necesitas GNU Make 3.81 o posterior para utilizar ndk-build o el NDK en general. Las secuencias de comandos de la compilación detectarán una herramienta Make que no cumple con los requisitos y generarán un mensaje de error.

Si tienes instalado Make 3.81 de GNU, pero el comando predeterminado make no lo inicia, define GNUMAKE en tu entorno para que apunte a él antes de iniciar ndk-build. Por ejemplo:

    $ export GNUMAKE=/usr/local/bin/gmake
    $ ndk-build
    

Puedes anular otras herramientas del host compiladas previamente en $NDK/prebuilt/<OS>/bin/ con las siguientes variables de entorno:

    $ export NDK_HOST_AWK=<path-to-awk>
    $ export NDK_HOST_ECHO=<path-to-echo>
    $ export NDK_HOST_CMP=<path-to-cmp>