NDK 缺少“平台”目录。在尝试构建时

Posted

技术标签:

【中文标题】NDK 缺少“平台”目录。在尝试构建时【英文标题】:NDK is missing a "platforms" directory. while trying to build 【发布时间】:2018-03-26 06:36:41 【问题描述】:

执行任务:[clean]

按需配置是一项孵化功能。 NDK 缺少一个 “平台”目录。如果您使用的是 NDK,请验证 ndk.dir 是否已设置 到一个有效的 NDK 目录。目前设置为 /Users/ishandutta2007/Library/android/sdk/ndk-bundle.如果你不是 使用 NDK,从 ANDROID_NDK_HOME 或取消设置 NDK 变量 local.properties 删除此警告。

项目 ':app' 中的配置 'compile' 已弃用。采用 改为“实施”。

FAILURE:构建失败并出现异常。

出了什么问题:配置项目 ':app' 时出现问题。

java.lang.NullPointerException(没有错误信息)

尝试:使用 --info 或 --debug 选项运行以获得更多日志输出。

异常是:org.gradle.api.ProjectConfigurationException:配置项目“:app”时出现问题。在 org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:87) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:82) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure(LifecycleProjectEvaluator.java:69) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.access$100(LifecycleProjectEvaluator.java:33) 在 org.gradle.configuration.project.LifecycleProjectEvaluator$ConfigureProject.run(LifecycleProjectEvaluator.java:103) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:49) 在 org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:651) 在 org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:133) 在 org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35) 在 org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62) 在 org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:100) 在 org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:81) 在 org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42) 在 org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54) 在 org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54) 在 org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) 在 org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36) 在 org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraph.run(DefaultGradleLauncher.java:265) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) 在 org.gradle.initialization.DefaultGradleLauncher.constructTaskGraph(DefaultGradleLauncher.java:173) 在 org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:128) 在 org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:107) 在 org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78) 在 org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75) 在 org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152) 在 org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100) 在 org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75) 在 org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:53) 在 org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) 在 org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) 在 org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32) 在 org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) 在 org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40) 在 org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51) 在 org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:45) 在 org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29) 在 org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39) 在 org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25) 在 org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:71) 在 org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:45) 在 org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:51) 在 org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32) 在 org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36) 在 org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25) 在 org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43) 在 org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29) 在 org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64) 在 org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29) 在 org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55) 在 org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42) 在 org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:58) 在 org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:33) 在 org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67) 在 org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) 在 org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) 在 org.gradle.util.Swapper.swap(Swapper.java:38) 在 org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62) 在 org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82) 在 org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 在 org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 在 org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) 在 org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297) 在 org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) 在 org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) 在 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) 引起:java.lang.NullPointerException at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:782) 在 com.android.build.gradle.internal.ndk.NdkHandler.getPlatformVersion(NdkHandler.java:158) 在 com.android.build.gradle.internal.ndk.NdkHandler.supports64Bits(NdkHandler.java:331) 在 com.android.build.gradle.internal.ndk.NdkHandler.getSupportedAbis(NdkHandler.java:397) 在 com.android.build.gradle.tasks.ExternalNativeJsonGenerator.create(ExternalNativeJsonGenerator.java:609) 在 com.android.build.gradle.internal.TaskManager.createExternalNativeBuildJsonGenerators(TaskManager.java:1532) 在 com.android.build.gradle.internal.ApplicationTaskManager.lambda$createTasksForVariantScope$10(ApplicationTaskManager.java:205) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81) 在 com.android.build.gradle.internal.ApplicationTaskManager.createTasksForVariantScope(ApplicationTaskManager.java:200) 在 com.android.build.gradle.internal.VariantManager.createTasksForVariantData(VariantManager.java:523) 在 com.android.build.gradle.internal.VariantManager.lambda$createAndroidTasks$1(VariantManager.java:338) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81) 在 com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:334) 在 com.android.build.gradle.BasePlugin.lambda$createAndroidTasks$5(BasePlugin.java:627) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81) 在 com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:622) 在 com.android.build.gradle.BasePlugin.lambda$null$3(BasePlugin.java:549) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81) 在 com.android.build.gradle.BasePlugin.lambda$createTasks$4(BasePlugin.java:545) 在 org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91) 在 org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80) 在 org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42) 在 org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230) 在 org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149) 在 org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58) 在 org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324) 在 org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234) 在 org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140) 在 org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37) 在 org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 在 com.sun.proxy.$Proxy23.afterEvaluate(未知来源) org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:75) ... 95 更多

通过https://help.gradle.org获得更多帮助

3 秒后构建失败

build.gradle(项目)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript 
    repositories 
        google()
        jcenter()
    

    dependencies 
        classpath 'com.android.tools.build:gradle:3.0.0-beta2'
    


allprojects 
    repositories 
        google()
        jcenter()
    


task clean(type: Delete) 
    delete rootProject.buildDir

build.gradle(app):

apply plugin: 'com.android.application'

android 
    compileSdkVersion 26
    buildToolsVersion '26.0.1'
    defaultConfig 
        applicationId 'org.tensorflow.demo'
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName '1.0'

        externalNativeBuild 
            cmake 
                cppFlags ""
            
        
        ndk 
            abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
        
    

    externalNativeBuild 
        cmake 
            path "CMakeLists.txt"
        
    


dependencies 
    compile 'org.tensorflow:tensorflow-android:1.3.0'

Android Studio:2.3.3

【问题讨论】:

How to fix android studios 2.3 NDK bug?的可能重复 尝试设置compileSdkVersion "android-26" 没找到你,已经 26 岁了。 不使用数字,而是使用文字字符串。并使用最新的 NDK。 【参考方案1】:

这可能是因为 Android Studio 会自动下载最新版本的 NDK,它没有 platforms 目录(不知道为什么!如果有人能澄清这一点,那就太好了)。

这对我有用。使用 SDK 管理器。那就是 Android Studio 右上角的图标,看起来像这样。转到 SDK 工具选项卡。在右下角,启用 Show Package Details 并安装 NDK 版本 20.0.5594570(您可以删除 Android Studio 自动安装的较新版本以节省空间)。

请注意,NDK 将安装在 Android SDK Location 中显示的位置。对我来说,设置为/home/<username>/.local/android-sdk。这意味着我可以在/home/<username>/.local/android-sdk/ndk/20.0.5594570/找到NDK

点击应用,完成后转到名为local.properties 的文件并添加此内容。

ndk.dir=/home/<username>/.local/android-sdk/ndk/20.0.5594570

根据您安装 NDK 的位置调整路径。

【讨论】:

我之前尝试过这个解决方案。但它仍然有同样的问题......我什至尝试打开项目结构对话框,并选择上面给出的路径,然后警告“NDK没有容器任何平台”....还是这个。 对我来说,'platforms' 目录就在默认的 'ndk-bundle' 文件夹之外,而不是在里面,所以我只是把它复制进去,它就起作用了....是的,不知道为什么!'...但非常感谢您的帮助!【参考方案2】:

很奇怪,对我来说ndk版本22.0.7026061确实没有platforms目录。在我的磁盘 ndk 版本 21.1.6352462 上有一个平台目录和设置

ndk.dir=/home/username/Android/Sdk/ndk/21.1.6352462

local.properties 上解决了问题。

【讨论】:

确实如此。 22.1.7171670 也没有 我一直在寻找这个答案 2 天。谢谢你帮助我。【参考方案3】:

我知道这是旧的,但只是遇到了这个,并且文件 -> 项目结构 -> SDK 位置 - Android NDK 位置设置丢失了。一旦我将其填写到“推荐”中,它就可以同步了

【讨论】:

【参考方案4】:

我终于找到了核心原因,解决办法是:

    升级 Gradle 和 AGP,并设置正确的 NDK 配置。 在 local.properties 中为较低的 AGP 版本设置 ndk.dir。

不同的 AGP(Android Gradle Plugin) 版本有不同的 NDK 配置。并且大部分AGP在未配置NDK时会自动下载更高版本的NDK,而更高版本的NDK没有platforms dir,导致AGP错误如--stacktrace所示。

对于较低的 AGP 版本,如 3.4.x,唯一的方法是设置 local.properties 或在 Android Studio 项目结构中设置 NDK 位置,也可以通过将其写入 local.properties 来设置 NDK 位置。

有关详细信息,请参阅 Android Develop 中的文档。

https://developer.android.com/studio/projects/configure-agp-ndk?language=agp3-5#agp-version

https://developer.android.com/studio/releases/gradle-plugin#updating-gradle

AGP 3.4.x NDK 配置仅 local.properties。

AGP 3.5.x NDK 配置支持 build.gradle。

【讨论】:

【参考方案5】:

我遇到了同样的问题,但是日志有些不同,从日志中我发现它与 NDK 有关。

我遇到的错误信息:

Caused by: java.lang.NullPointerException at com.android.build.gradle.internal.ndk.NdkHandler.getPlatformVersion(NdkHandler.java:121) 

以下是要检查的事项,

    检查是否已正确下载和配置 NDK。

Cntrl + Alt + Shift + S,如果配置正确,您应该会在字段中看到自动填充的位置。

如果没有,下载更新local.properties文件中的路径。

    检查 gradle 构建工具是否已更新。

打开Project gradle文件,确保你下载的依赖和gradle文件中的依赖匹配。

(提示:创建一个新应用,复制并粘贴创建应用时生成的版本。)

    当上述步骤正确时,请确保使用正确版本的 gradle 分发更新 gradle-wrapper.properties 文件,

提示:如果以上 2 个步骤配置正确,Android Studio 应该也会建议您更新此 url。

发布这个,应用程序应该可以正确构建,没有任何问题。

祝你好运...!

【讨论】:

将 ndkVersion 从 22.xxxxx 设置为 21.xxxxxx 解决了我类似的 NDKHandler 问题..【参考方案6】:

按需配置是一项孵化功能。 NDK 缺少“平台”目录。

如果您使用的是 NDK,请验证 ndk.dir 是否设置为有效的 NDK 目录。

目前设置为C:\Users\MSI\AppData\Local\Android\Sdk\ndk-bundle

如果您未使用 NDK,请从 ANDROID_NDK_HOMElocal.properties 中取消设置 NDK 变量以删除此警告。

【讨论】:

这绝不是一个答案,它甚至是问题的一部分!【参考方案7】:

(android 5.3)我们可以通过从你的项目中删除android NDK插件来解决它。进入设置->插件->android ndk support disable,点击apply,点击ok

【讨论】:

请考虑在您的回答中添加一些解释和细节。 是的,让我们禁用构建项目所需的东西...

以上是关于NDK 缺少“平台”目录。在尝试构建时的主要内容,如果未能解决你的问题,请参考以下文章

mfp cli 7.1 for android 平台中的cordova 缺少文件

TFS 代理构建中缺少安装

Unity Hub2.4和2.5安装2021和2020和2019编辑器,编译Andriod时缺少SDKNDKJDK解决办法

缺少平台 android 所需的内容重新安装 xcode

Eclipse 中的 Android 项目缺少“添加本机支持”

linux / uinput.h缺少32位arm android ndk独立工具链?