Плагин Android Gradle 1.1.0 - getNdkFolder () больше не найден, есть ли замена?

Я только что обновил плагин Android Gradle до 1.1.0 с 1.0.0 и получил эту ошибку:

Нет подписи метода: com.android.build.gradle.LibraryPlugin.getNdkFolder() применимо для типов аргументов: () значения: []

Я пытался найти разницу между плагинами Gradle 1.0.0 и 1.1.0, но нигде не смог найти в Интернете.

Похоже, метод getNdkFolder был либо изменен, либо удален.

Есть ли замена? Или любой другой способ получить NdkFolder?

Я использую этот метод вот так,

def ndkDir = project.plugins.findPlugin('com.android.library').getNdkFolder()

Я также подал жалобу на команду инструментов в системе отслеживания проблем Android: https://code.google.com/p/android/issues/detail?id=152810

Благодарю вас !


person shaktiman_droid    schedule 19.02.2015    source источник
comment
вы хотите указать папку, в которой находится NDK, или папку, в которой находится код jni ваших проектов? ndk.dir может находиться в файле local.properties вместе с sdk.dir.   -  person Robert Rowntree    schedule 20.02.2015
comment
В качестве замены getNdkFolder() для инструментов сборки 2.3.0 и более поздних версий см. этот пост to-build-tools-2-3-0/42923520#42923520">Нет поля sdkHandler в LibraryPlugin после обновления до инструментов сборки 2.3.0   -  person Tjaart    schedule 14.06.2017


Ответы (5)


Вы можете получить это следующим образом:

plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
person Michael Pardo    schedule 24.02.2015
comment
Спасибо, мне не удалось заглянуть в источники Android Gradle Plugin. - person Artem Zinnatullin; 02.03.2015
comment
Кажется, это больше не работает в Android Studio 2.3. См. @Cameron's для решения. - person Ryan R; 01.02.2017
comment
Да, начиная с версии 2.3, ответ Кэмерона сработал. - person Andrei Tudor Diaconu; 05.03.2017

Правильный путь - android.ndkDirectory

Изменение с android.plugin.ndkFolder на android.ndkDirectory было задокументировано в техническом документе Перенос проектов Gradle на версию 1.0.0. Кроме того, вам следует обновить плагин Android до версии 2.3.0.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
    }
}

sdkFolder является внутренним и, скорее всего, перестанет работать так же, как перестал работать ndkFolder.

По поводу экспериментальных веток

Поищите, плагин достаточно проработан, и вам будет сложно найти причины для использования экспериментальных веток с NDK.

Существует некоторое обсуждение экспериментальной версии плагина, нарушающей ndkDirectory, который является задокументированным способом доступа к этому значению после версии 1.1. Если это изменится в выпущенной версии, я обновлю свой ответ, а тем временем, если вам нужны экспериментальные плагины, вы можете обойти эту ошибку/функцию, используя ответ @Alex Cohn.

person Cameron Lowell Palmer    schedule 28.07.2015
comment
Снова сломался с переходом на экспериментальный плагин :( - person Alex Cohn; 17.09.2015
comment
Согласно документации, это все еще должно быть правильно, поэтому я бы зарегистрировал ошибку на вашем месте. Быстрая проверка не выявила открытых ошибок. - person Cameron Lowell Palmer; 18.09.2015
comment
Почему вы считаете, что android.ndkDirectory не было частью большого изменения DSL для следующей версии Android-плагина? В любом случае, я нашел альтернативный подход: stackoverflow.com/a/32658072/192373 - person Alex Cohn; 18.09.2015
comment
Экспериментальный плагин поставляется с большой красной этикеткой с предупреждением о том, что все может измениться. Пока что-то на самом деле не отправлено/не задокументировано, я не думаю, что нам следует путать ответ, добавляя примечания об экспериментальных версиях. По всей вероятности это баг. - person Cameron Lowell Palmer; 18.09.2015
comment
Правда в том, что все кредиты должны принадлежать Riccardo Ciovati: Как прочитать свойства, определенные в local.properties в build.gradle - person Alex Cohn; 19.09.2015
comment
@AlexCohn Это еще один способ делать что-то, но не обязательно лучший. Каждый раз, когда вы вводите строки в качестве аргументов функций, мир становится немного хуже. - person Cameron Lowell Palmer; 05.03.2017

Я использую версию Gradle 2.2.3. Мысль, которая сработала для меня:

def ndkDir = проект.android.ndkDirectory

Ссылка Ссылка: https://code.google.com/p/android/issues/detail?id=152810

person sgupta    schedule 31.03.2017

Если в файле build.gradle вы, вероятно, можете использовать это сейчас, когда указанная ошибка помечена как исправленная.

project.android.ndkDirectory 

Если вы находитесь в пользовательской задаче или плагине, вы захотите использовать это

    def androidPluginExtension = project.getExtensions().getByName("android");
    // Use this for easily viewing the properties available in the extension.
    androidPluginExtension.properties.each { Object key, Object value ->
        logger.info("Extensionprop: ${key} ${value}")
    }
    String ndkDir = androidPluginExtension.getProperties().get("ndkDirectory");
    System.out.println("Using ndk dir: ${ndkDir}");

Но помните, что подключаемый модуль Android должен был быть инициализирован, поэтому он всегда будет работать в методе выполнения задачи, но может не работать, если Gradle еще не проанализировал Android DSL на этапе настройки Gradle.

person PaulR    schedule 30.12.2015

Как упомянул Майкл Пардо, вы можете получить его *

plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()

*

, В случае получения следующей ошибки:

Error:(9, 0) Plugin with id com.android.library has not been used.

Вы можете использовать прилагаемый плагин: «com.android.application», поэтому окончательный код будет:

def ndkDir = plugins.getPlugin('com.android.application').sdkHandler.ndkFolder
person Davood Falahati    schedule 19.12.2015