configurar - Diferencia entre CMake y NDK-build en el proyecto de estudio Android
c++ android apk (4)
¿Cuál es la diferencia real entre CMake
y NDK
en el proyecto de Android Studio? Ya revisé la documentación de google, pero el concepto aún no está claro. Según la documentación de google:
El Android Native Development Kit (NDK): un conjunto de herramientas que le permite usar códigos C y C ++ con Android, y proporciona bibliotecas de plataforma que le permiten administrar actividades nativas y acceder a los componentes físicos del dispositivo, como sensores y entradas táctiles.
CMake: una herramienta de compilación externa que funciona junto con Gradle para construir su biblioteca nativa. No necesita este componente si solo planea usar ndk-build.
¿Alguien puede tener una mejor explicación con un ejemplo cuando necesitamos usar qué?
Android.mk es un archivo que contiene NDK-build, si usas Cmake compila tu aplicación, no necesitas Android.mk sino CmakeList.txt
La respuesta clara está aquí https://android-developers.blogspot.ru/2016/11/make-and-ndk-build-support-in-android.html . Resumen: elija en orden:
use el plugin experimental gradle para proyectos con C ++ limitado
cmake para una mayor estabilidad es nuevos proyectos
ndk-build es para proyectos heredados, intenta migrar a cmake o un nuevo plugin
Para aclarar algo de confusión aquí: ndk-build es un sistema de compilación incluido en el NDK. Utiliza archivos Android.mk
. El NDK en sí es una colección de compiladores y bibliotecas que se necesitan para compilar el código C / C ++ para Android. ndk-build y cmake usan el NDK.
¿Cuál es la diferencia real entre CMake y NDK en el proyecto de Android Studio?
Usan un lenguaje diferente (makefiles personalizados vs cmake) para describir las compilaciones. Idealmente, no hay diferencia en el rendimiento para compilaciones descritas de forma idéntica, pero eso no significa que no haya ningún error.
¿Alguien puede tener una mejor explicación con un ejemplo cuando necesitamos usar qué?
En general, use el sistema que prefiera.
La principal ventaja de CMake es que puedes usar un conjunto de archivos de compilación para todos tus objetivos (Android, Linux, Windows, iOS, etc.). Si su proyecto es multiplataforma, CMake debería hacerlo más fácil. También es ampliamente conocido fuera de los desarrolladores de Android, por lo que las personas nuevas en Android tendrán una mejor oportunidad de entenderlo.
ndk-build debería ser preferible si está construyendo un proyecto que ya usa archivos Android.mk
para su sistema de compilación (proyectos heredados).
Si está escribiendo un código nuevo, use lo que sea que se sienta cómodo. Si no está familiarizado con ninguno de ellos, cmake es probablemente la mejor opción porque facilitará el trabajo multiplataforma en el futuro si decide hacerlo.
He tratado de dar una explicación para identificar las diferencias entre CMake y NDK-Build y la configuración:
Algunas notas iniciales:
- La herramienta de compilación predeterminada de Android Studio para bibliotecas nativas es CMake.
- Android Studio también es compatible con ndk-build debido a la gran cantidad de proyectos existentes que usan el kit de herramientas de compilación para compilar su código nativo.
- Si está creando una nueva biblioteca nativa, debe usar CMake.
- Se incluye soporte para ndk-build debido a la gran cantidad de proyectos heredados.
CMake:
Una herramienta de compilación externa que funciona junto con Gradle para construir su biblioteca nativa. No necesita este componente si solo planea usar ndk-build. CMake requiere un script de compilación para saber cómo construir su biblioteca nativa. Para nuevos proyectos, Android Studio crea un script de construcción de CMake, CMakeLists.txt
, y lo coloca en el directorio raíz de su módulo.
Si sus fuentes nativas aún no tienen una secuencia de comandos de compilación de CMake, debe crear una usted mismo e incluir los comandos CMake apropiados. Un script de compilación CMake es un archivo de texto sin formato que debe nombrar CMakeLists.txt.
# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.
cmake_minimum_required(VERSION 3.4.1)
# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.
add_library( # Specifies the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/file_name.cpp )
NDK-Build:
Android Studio también admite ndk-build debido a la gran cantidad de proyectos existentes / heredados que utilizan el kit de herramientas de compilación para compilar su código nativo. Debe crear uno usted mismo e incluir el archivo Android.mk apropiado para ndk-build y luego debe configurar el archivo gradle para ndk-build igual que CMake.
Configure Gradle para CMake y ndk-build:
Para configurar manualmente Gradle para que se vincule con su biblioteca nativa, debe agregar el bloque externalNativeBuild
a su archivo build.gradle
nivel de build.gradle
y configurarlo con el bloque cmake o ndkBuild:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake/ndkBuild {
// Passes optional arguments to CMake.
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
// Sets optional flags for the C compiler.
cFlags "-fexceptions", "-frtti"
// Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-D__STDC_FORMAT_MACROS"
}
}
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters ''x86'', ''x86_64'', ''armeabi'', ''armeabi-v7a'',
''arm64-v8a''
}
}
buildTypes {...}
// Encapsulates your external native build configurations.
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "src/main/cpp/CMakeLists.txt"
}
// Encapsulates your ndkBuild build configurations.
ndkBuild {
// Provides a relative path to your ndkBuild Android.mk file.
path "src/main/cpp/Android.mk"
}
}
}
Si desea vincular Gradle a un proyecto ndk-build existente, utilice el bloque ndkBuild
lugar del bloque cmake y proporcione una ruta relativa a su archivo Android.mk
.