Мне нужно определить некоторые настраиваемые макросы, такие как «ОТЛАЖИВАТЬ», «ВЫПУСКАТЬ», «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», ни «Продукт», метод не может быть найден. Итак, как правильно передавать макросы компилятора для разных вкусов и типов сборки продукта?
Сам нашел ответ: Метод cmake принадлежит классу externalNativeBuild, поэтому его нужно встроить в блок externalNativeBuild, например:
release
{
externalNativeBuild
{
cmake
{
cppFlags += "-DRELEASE"
}
}
...
}
Теперь все препроцессоры, определенные в build.gradle, передаются в компилятор C / C++.
Я сделал быстрый тест. В результате IDE не выделяет отключенные блоки кода серым цветом, что плохо. Но хорошо то, что препроцессоры действительно передаются, поэтому они вступают в силу во время компиляции. Надеюсь, что Android Studio улучшит это в будущем.
Правильно ли реагирует среда IDE на эти определения за вас, т. Е. На затенение путей кода, удаленных препроцессором? Мы передаем препроцессор, который определяет способ, который вы описываете, но среда IDE не обновляется правильно (все еще затеняет активные пути кода).