web-dev-qa-db-fra.com

Différence entre CMake et NDK-construit dans Android projet de studio

Quelle est la différence entre CMake et NDK intégré Android. J'ai déjà consulté la documentation Google mais le concept n’est pas encore clair. Selon documentation google:

Android Kit de développement natif (NDK):) est un ensemble d’outils qui vous permet d’utiliser du code C et C++ avec Android et fournit des bibliothèques de plates-formes vous permettant de gérer des activités natives. et accéder aux composants physiques du périphérique, tels que les capteurs et la saisie tactile.

CMake: Un outil de génération externe qui fonctionne avec Gradle pour créer votre bibliothèque native. Vous n'avez pas besoin de ce composant si vous envisagez uniquement d'utiliser ndk-build.

Quelqu'un peut-il avoir une meilleure explication avec un exemple lorsque nous devons utiliser quoi?

46
0xAliHn

Pour dissiper une certaine confusion, ndk-build est un système de compilation inclus dans le NDK. Il utilise Android.mk des dossiers. Le NDK lui-même est un ensemble de compilateurs et de bibliothèques nécessaires à la création de code C/C++ pour Android. ndk-build et cmake utilisent tous deux le NDK.

Quelle est la différence entre CMake et NDK construit Android projet de studio.

Ils utilisent un langage différent (makefiles personnalisés vs cmake) pour décrire les builds. Idéalement, il n'y a pas de différence de sortie pour les versions décrites de manière identique, mais cela ne signifie pas qu'il n'y a pas de bugs.

Quelqu'un peut-il avoir une meilleure explication avec un exemple lorsque nous devons utiliser quoi?

En général, utilisez le système que vous préférez.

Le principal avantage de CMake est que vous pouvez utiliser un ensemble de fichiers de construction pour toutes vos cibles (Android, Linux, Windows, iOS, etc.). Si votre projet est multi-plateforme, CMake devrait vous faciliter la tâche. Il est également largement connu en dehors des développeurs Android), afin que les personnes novices en Android auront une meilleure chance de le comprendre.

ndk-build devrait être préféré si vous construisez un projet qui utilise déjà Android.mk fichiers pour son système de construction (projets hérités).

Si vous écrivez un nouveau code, utilisez ce que vous êtes à l'aise. Si vous ne le connaissez pas non plus, cmake est probablement le meilleur choix car il facilitera le travail multi-plateformes à l'avenir si vous choisissez de le faire.

51
Dan Albert

J'ai essayé de donner quelques explications pour identifier la différence entre CMake et NDK-Build et setup:

Quelques notes initiales:

  • CMake est l'outil de construction par défaut d'Android Studio pour les bibliothèques natives.
  • Android Studio prend également en charge ndk-build en raison du grand nombre de projets existants qui utilisent le toolkit de compilation pour compiler leur code natif.
  • Si vous créez une nouvelle bibliothèque native, vous devez utiliser CMake.
  • La prise en charge de ndk-build est incluse en raison du grand nombre de projets hérités.

CMake:

Un outil de génération externe qui fonctionne avec Gradle pour créer votre bibliothèque native. Vous n'avez pas besoin de ce composant si vous envisagez uniquement d'utiliser ndk-build. CMake nécessite un script de compilation pour savoir comment construire votre bibliothèque native. Pour les nouveaux projets, Android Studio crée un script de génération CMake, CMakeLists.txt, Et le place dans le répertoire racine de votre module.

Si vos sources natives ne possèdent pas déjà de script de génération CMake, vous devez en créer un vous-même et inclure les commandes CMake appropriées. Un script de génération CMake est un fichier texte que vous devez nommer 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 prend également en charge ndk-build en raison du grand nombre de projets existants/hérités qui utilisent le toolkit de compilation pour compiler leur code natif. Vous devez en créer un vous-même et inclure le fichier Android.mk approprié pour ndk-build, puis configurer le fichier Gradle pour ndk-build de la même manière que CMake.

Configurez Gradle à la fois pour CMake et ndk-build:

Pour configurer manuellement Gradle afin qu'il se connecte à votre bibliothèque native, vous devez ajouter le bloc externalNativeBuild à votre fichier build.gradle Au niveau du module et le configurer avec le bloc cmake ou 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 vous souhaitez lier Gradle à un projet ndk-build existant, utilisez le bloc ndkBuild à la place du bloc cmake et indiquez un chemin relatif au fichier Android.mk.

14
0xAliHn

La réponse claire est ici https://Android-developers.blogspot.ru/2016/11/make-and-ndk-build-support-in-Android.html . Résumé - choisissez dans l'ordre:

  • utiliser gradle experimental plugin pour les projets avec C++ limité

  • cmake pour plus de stabilité est de nouveaux projets

  • ndk-build est pour les projets hérités, essayez de migrer vers cmake ou un nouveau plugin

1
trolleg