web-dev-qa-db-ja.com

Android studioプロジェクトのCMakeとNDKビルドの違い

CMakeNDK build in Android studio project。の実際の違いは何ですか。私はすでにGoogleドキュメントを調べましたが、コンセプトはまだ明確ではありません。 Googleドキュメント:

Android Native Development Kit(NDK): AndroidでCおよびC++コードを使用でき、ネイティブアクティビティを管理できるプラットフォームライブラリを提供するツールセットセンサーやタッチ入力などの物理デバイスコンポーネントにアクセスします。

CMake: Gradleと連携してネイティブライブラリをビルドする外部ビルドツール。 ndk-buildのみを使用する場合、このコンポーネントは必要ありません。

何を使用する必要がある場合、例で誰かがより良い説明をすることができますか?

46
0xAliHn

ここで混乱を解消するために:ndk-buildはNDKに含まれているビルドシステムです。 Android.mkファイルを使用します。 NDK自体は、Android用のC/C++コードを構築するために必要なコンパイラーとライブラリーのコレクションです。 ndk-buildとcmakeは両方ともNDKを使用します。

CMakeとNDKビルドの実際の違いは何ですかAndroid studioプロジェクト。

ビルドを記述するために、異なる言語(カスタムメイクファイルとcmake)を使用します。理想的には、同じように記述されたビルドの出力に違いはありませんが、それはバグがないという意味ではありません。

何を使用する必要がある場合、例で誰かがより良い説明をすることができますか?

一般に、お好みのシステムを使用してください。

CMakeの主な利点は、すべてのターゲット(Android、Linux、Windows、iOSなど)に対して1組のビルドファイルを使用できることです。プロジェクトがクロスプラットフォームの場合、CMakeを使用すると簡単になります。また、Android開発者以外でも広く知られているため、Androidを初めて使用する人は理解する可能性が高くなります。

ビルドシステムにAndroid.mkファイルを既に使用しているプロジェクト(レガシープロジェクト)をビルドする場合は、ndk-buildをお勧めします。

新しいコードを作成する場合は、使いやすいものを使用してください。どちらにも精通していない場合は、将来的にクロスプラットフォームでの作業を簡単に行えるようになるため、cmakeがおそらくより良い選択です。

51
Dan Albert

CMakeとNDK-Buildとセットアップの違いを特定するための説明を試みました:

最初の注意事項:

  • ネイティブライブラリ用のAndroid StudioのデフォルトのビルドツールはCMakeです。
  • Android Studioは、ビルドツールキットを使用してネイティブコードをコンパイルする既存のプロジェクトが多数あるため、ndk-buildもサポートしています。
  • 新しいネイティブライブラリを作成する場合は、CMakeを使用する必要があります。
  • 多数のレガシープロジェクトのため、ndk-buildのサポートが含まれています。

CMake:

Gradleと連携してネイティブライブラリをビルドする外部ビルドツール。 ndk-buildのみを使用する場合、このコンポーネントは必要ありません。 CMakeには、ネイティブライブラリのビルド方法を知るためのビルドスクリプトが必要です。新しいプロジェクトの場合、Android StudioはCMakeビルドスクリプトCMakeLists.txtを作成し、モジュールのルートディレクトリに配置します。

ネイティブソースにCMakeビルドスクリプトがまだない場合は、自分で作成して適切なCMakeコマンドを含める必要があります。 CMakeビルドスクリプトは、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は、ビルドツールキットを使用してネイティブコードをコンパイルする多数の既存/レガシープロジェクトのため、ndk-buildもサポートしています。自分で作成し、ndk-buildに適切なAndroid.mkファイルを含めてから、CMakeと同じndk-buildにgradleファイルを設定する必要があります。

CMakeとndk-buildの両方にGradleを設定:

ネイティブライブラリにリンクするようにGradleを手動で構成するには、モジュールレベルのbuild.gradleファイルにexternalNativeBuildブロックを追加し、cmakeまたは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"
        }
    }
}

Gradleを既存のndk-buildプロジェクトにリンクする場合は、cmakeブロックの代わりにndkBuildブロックを使用し、Android.mkファイルへの相対パスを指定します。

14
0xAliHn

明確な答えはこちら https://Android-developers.blogspot.ru/2016/11/make-and-ndk-build-support-in-Android.html 。要約-順番に選択:

  • c ++が制限されているプロジェクトにはgradle Experimentalプラグインを使用します

  • より安定させるためのcmakeは新しいプロジェクトです

  • ndk-buildはレガシープロジェクト用です。cmakeまたは新しいプラグインに移行してください

1
trolleg