Android Studio: как определить пользовательские макросы в build.gradle (для разных вариантов сборки) и позволить нативному коду C / C++ их обнаруживать?

Мне нужно определить некоторые настраиваемые макросы, такие как «ОТЛАЖИВАТЬ», «ВЫПУСКАТЬ», «DEMO_VER» и «FULL_VER» в файле Android Studio build.gradle, чтобы мой код C / C++ мог их обнаруживать, например:

#ifdef DEBUG
   ...
#else //RELEASE
   ...
#endif

или

#ifdef DEMO_VER
   ...
#else //FULL_VER
   ...
#endif

Насколько я понимаю, эти макросы должны быть определены как параметры компилятора g ++ в блоках вариантов сборки, например в следующем коде:

buildTypes 
{
    release 
    {
        cmake   <<====== Error!!!!!: could not find method cmake() for ...BuildType
        {
            cppFlags += "-DRELEASE"
        }
    }
    debug 
    {
        cmake   <<====== Error!!!!!: could not find method cmake() for ...BuildType
        {
            cppFlags += "-DDEBUG"
        }
    }
}
flavorDimensions "version"
productFlavors 
{
    demo 
    {
        cmake   <<====== Error!!!!!: could not find method cmake() for ...ProductFlavor
        {
            cppFlags += "-DEMO_VER"
        }
    }
    full
    {
        cmake   <<====== Error!!!!!: could not find method cmake() for ...ProductFlavor
        {
            cppFlags += "-DFULL_VER"
        }
    }
}

Проблема в том, что я не могу использовать «cmake» ни внутри «BuildType», ни «Продукт», метод не может быть найден. Итак, как правильно передавать макросы компилятора для разных вкусов и типов сборки продукта?

1
0
1 409
1

Ответы 1

Сам нашел ответ: Метод cmake принадлежит классу externalNativeBuild, поэтому его нужно встроить в блок externalNativeBuild, например:

release
{
        externalNativeBuild
        {
            cmake
            {
                cppFlags += "-DRELEASE"
            }
        }
        ...
}

Теперь все препроцессоры, определенные в build.gradle, передаются в компилятор C / C++.

Правильно ли реагирует среда IDE на эти определения за вас, т. Е. На затенение путей кода, удаленных препроцессором? Мы передаем препроцессор, который определяет способ, который вы описываете, но среда IDE не обновляется правильно (все еще затеняет активные пути кода).

chrisvarnz 24.10.2018 15:17

Я сделал быстрый тест. В результате IDE не выделяет отключенные блоки кода серым цветом, что плохо. Но хорошо то, что препроцессоры действительно передаются, поэтому они вступают в силу во время компиляции. Надеюсь, что Android Studio улучшит это в будущем.

Hongkun Wang 25.10.2018 17:24

Другие вопросы по теме