Android Studio CMake / Ninja не используется для создания проекта NDK - PullRequest
0 голосов
/ 01 февраля 2019

У меня установлены следующие CMAKE & Ninja, установленные с помощью SDK Tools для Android Studio:

~/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja --version
1.8.2

Я сталкиваюсь с «Конфигурированием ошибок» при попытке построить свой проект.Вот результат сборки:

Executable : /Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake
arguments : 
-H/Users/ssk/MyProject
-B/Users/ssk/MyProject/.externalNativeBuild/cmake/debug/armeabi-v7a
-DANDROID_ABI=armeabi-v7a
-DANDROID_PLATFORM=android-16
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/ssk/MyProject/build/intermediates/cmake/debug/obj/armeabi-v7a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_CXX_FLAGS=-std=c++11
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_SYSTEM_VERSION=16
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_ANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_TOOLCHAIN_FILE=/Users/ssk/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake
-G Ninja
-DANDROID_STL=gnustl_statics
-DANDROID_CPP_FEATURES=rtti exception
-DANDROID_TOOLCHAIN=gcc
-DANDROID_NDK=/Users/ssk/android-ndk-r17c/
jvmArgs : 

Отсутствует:

-DCMAKE_MAKE_PROGRAM=/Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja

Ошибка:

 CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool

Только если я переключусь на CMakeВерсия скажем, 3.6.3155560 это работает.В противном случае я должен установить ниндзя из Brew или MacPort.

Вот фрагмент из моего build.gradle:

 externalNativeBuild {
        cmake {
            // Linker flags and Visibility options keeps the size of the library small
            cppFlags "-std=c++11"
            arguments "-DANDROID_STL=gnustl_static",
                      "-DANDROID_CPP_FEATURES=rtti exceptions",
                      "-DANDROID_TOOLCHAIN=gcc"
        }
    }

Как это исправить?

1 Ответ

0 голосов
/ 01 февраля 2019

Установка / обновление CMake из Android Studio SDK Manager

Install/Update CMake From Android Studio SDK Manager

Проверьте свой CMake из корневого каталога SDK, если существует ниндзя.enter image description here


Ниже это не хорошо.

cmake {
    cppFlags "-std=c++11"
    arguments "-DANDROID_ABI=armeabi-v7a",
                "-DANDROID_PLATFORM=android-16",
                "-DANDROID_STL=gnustl_static",
                "-DANDROID_CPP_FEATURES=rtti exceptions",
                "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=libs"
}

Поскольку ANDROID_PLATFORM должно автоматически определяться внешней собственной системой сборки Android в соответствии с minSdkVersion, см. Ниже официальный документ о том, как ANDROID_PLATFORM работает :

Вместо непосредственного изменения этого флага вы должны установить свойство minSdkVersion в блоках defaultConfig или productFlavors вашего файла build.gradle уровня модуля.Это гарантирует, что ваша библиотека используется только приложениями, установленными на устройствах с адекватной версией Android.Затем набор инструментов CMake выбирает лучшую версию платформы для создаваемого ABI, используя следующую логику:

  1. Если существует версия платформы для ABI, равная minSdkVersion, CMake использует эту версию.В противном случае,
  2. , если существуют версии платформы ниже, чем minSdkVersion для ABI, CMake использует самую высокую из этих версий платформы.Это разумный выбор, потому что отсутствующая версия платформы обычно означает, что с предыдущей доступной версии не было никаких изменений в API нативной платформы.
  3. В противном случае, CMake использует следующую доступную версию платформы выше minSdkVersion.

И, -DANDROID_ABI=armeabi-v7a тоже нехорошо.Вы не должны определять этот параметр здесь.CMake автоматически выполнит итерацию всех ваших ABI в соответствии с вашими abiFilters.Если вы просто хотите построить armeabi-v7a, вы можете указать это, используя abiFilter, например,

externalNativeBuild {
    cmake {
        abiFilters 'armeabi-v7a', 'arm64-v8a'
    }
}

Кроме того, rtti и exceptions равны cppFlags, ниже должен быть правильный способустановите эти два флага.

cppFlags "-std=c++11 -frtti -fexceptions"

Убедитесь, что вы правильно настроили ANDROID_NDK путь, потому что в соответствии с вашим вопросом у вас есть TWO версия набора NDK, одна - -DANDROID_NDK=/Users/ssk/android-ndk-r17c/, другая --DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle.Конфигурация NDK path от local.properties:

ndk.dir=/Users/ssk/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/ssk/Library/Android/sdk

Что такое исправление для -Gandroid Gradle - Ninja?

Добавьте ниже arguments в cmake config:

externalNativeBuild { 
    cmake { 
        ...
        version "3.10.2"
        arguments "-GAndroid Gradle - Ninja"
    } 
} 
...