【问题标题】:Error: Your project contains C++ files but it is not using a supported native build错误:您的项目包含 C++ 文件,但未使用受支持的本机构建
【发布时间】:2017-01-22 13:24:00
【问题描述】:

错误:任务 ':app:compileDebugNdk' 执行失败。

错误:您的项目包含 C++ 文件,但未使用受支持的本机构建系统。 考虑将 CMake 或 ndk-build 与稳定的 Android Gradle 插件集成:

Screenshot

【问题讨论】:

标签: android-studio


【解决方案1】:

看来你已经有了 C++ 代码和项目目录中的 Makefiles,在这种情况下,你只需要将 Gradle 链接到本机库:

  1. 在您的项目窗格中,右键单击您的模块,然后选择 Link 使用 Gradle 的 C++ 项目
  2. 下拉列表 中选择 CMakendk-build,具体取决于您的项目

    一个。如果您选择 CMake,请在项目中指定 CMakeLists.txt 脚本

    b.如果您选择 ndk-build,请指定 Android.mk

来源: https://developer.android.com/studio/projects/add-native-code.html#existing-project

【讨论】:

  • 能否请您提及 Android.mk 或 CMakeLists.txt 路径位置。我找到了多个同名的文件。
  • 你可以在里面找到你的Android.mk; app/build/intermediates/ndk/debug.
  • @Voltshan 在我的情况下,中间体中没有 ndk 文件夹。我该怎么办?
  • @Janman 我按照你的回答,但现在 android studio 说 Android.mk 文件不存在。你能指导我吗?
【解决方案2】:

如今的 Android 插件给出了更好的解释。

* 出了什么问题:

任务“:app:compileDebugNdk”执行失败。
> 错误:您的项目包含 C++ 文件,但未使用受支持的本机构建系统。
考虑使用 CMake 或 ndk-build 集成。欲了解更多信息,请访问: http://d.android.com/r/studio-ui/add-native-code.html
或者,您可以使用实验性插件: https://developer.android.com/studio/build/experimental-plugin.html.

基本上有两种选择:使用集成的 externalNativeBuild,或者禁用它。

  1. 第一个选项的最佳方法是described by Janman

    这些天我不推荐使用experimental plugin,因为我相信ndk-build 集成更强大。但是使用实验性插件可能更容易维护简单的项目。

  2. 或者,出于某种原因,您可以选择在 Android Studio 之外构建本机库。为了防止出现错误消息,我知道三个选项。

    1. 您可以禁用gradle任务:在build.gradle中,添加

      tasks.all { task ->
        if (task.name.startsWith('compile') && task.name.endsWith('Ndk')) {
          task.enabled = false
        }
      }
      
    2. 您可以在 Android Studio 中hide the cpp files,例如

      sourceSets {
        main {
          jni.srcDirs = []
        }
      }
      

      这种方法的缺点是 cpp 文件没有被 Android Studio 索引。

    3. 另一个alternative 是将android.useDeprecatedNdk=true 添加到gradle.properties。不过,目前尚不清楚该标志将工作多长时间。

【讨论】:

    【解决方案3】:

    新解决方案将此添加到您的 build.gradle(Module:app)

    externalNativeBuild {
        cmake {
            version "3.12.0"
        }
        ndkBuild {
            path 'src/main/jni/Application.mk'
        }
    }
    

    【讨论】:

      【解决方案4】:

      只需将android.useDeprecatedNdk=true 添加到 gradle.properties 文件即可。

      【讨论】:

      • 糟糕,构建工作,但是当我运行项目时。我也有同样的问题。问题没有解决。但感谢您的回复。
      【解决方案5】:

      我这样解决了这个问题。 首先,不要在项目目录中创建任何空白。 然后编辑 build.gradle(Module:app) 并像我一样添加这些行。

       buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
      }
      sourceSets { main { jni.srcDirs = ['src/main/jni/','src/main/jniLibs/'] } }
      externalNativeBuild {
          ndkBuild {
              path 'build/intermediates/ndk/debug/Android.mk'
          }
      }
      

      【讨论】:

      • Android.mk 文件未找到。我该怎么办?
      • @Shomu 你解决了这个问题吗?我面临同样的问题 Android.mk 文件不存在
      【解决方案6】:
      1. 确保您已安装依赖项 LLDB、CMake 和 NDK 如果没有,请从 Tools > Android > SDK Manager 中选择 SDK TOOLS 检查 相应的框并应用。
      2. 在app中获取build.gradle并搜索

        sourceSets { 
            main { 
                jni.srcDirs = ['src/main/jni', 'src/main/jniLBS/'] 
            } 
        }
        

        并评论这一行。

      【讨论】:

        【解决方案7】:
        1. 在 android studio 3.3.1 中处理 OpenCV 项目。我遇到了同样的问题,并通过在 Tools-> SDK Manager -> Android SDK-> SDK Tools 下安装 CMake、LLDB 和 NDK 找到了解决方案。
        2. 将以下内容添加到 build.gradle(Module:app)

          externalNativeBuild {
                  cmake {
                              version "3.12.0"
                  }
                  ndkBuild {
                              path 'build/intermediates/ndk/debug/Android.mk'
                  }
             }
          }
          

        【讨论】:

          【解决方案8】:

          非常重要的是删除 build.gradle (Module:app) 中的这一行。

          sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }

          【讨论】:

            【解决方案9】:

            您必须关心 gradle(module.app) 中的 sourceSets,并查看 jni 的 lib 文件夹名称是什么 例如,我的文件夹名称是 jniLins,所以我不得不从 sourceSets 中删除 jni 文件夹,但最好的方法是将数组留空,以便它可以从 exixting 文件夹中读取 我的意思是而不是

            sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }
            

            写这个:

            sourceSets { main { jni.srcDirs = [] } }
            

            【讨论】:

              【解决方案10】:

              您可以在多个地方放置一个表示不同含义的“externalNativeBuild”块。它需要在 android { } 块和 android { defaultConfig { } } 块中。如果缺少外部的,你会得到这个。这里的一个工作示例:https://github.com/kennethreitz/super-sphere/blob/master/dist/android/love/build.gradle 似乎不需要“ndk”块。

              android {
                  defaultConfig {
                      externalNativeBuild {
                          ndkBuild {
                              arguments "-j2"
                          }
                      }
                  }
              
                  externalNativeBuild {
                      ndkBuild {
                          path "src/jni/Android.mk"
                      }
                  }
              }
              

              【讨论】:

                【解决方案11】:

                不是最好的解决方案,但快速的方法是通过添加以下行在gradle.properties 中将“NDK 弃用”设置为 60 天:

                android.deprecatedNdkCompileLease=1608114817403
                

                【讨论】:

                  猜你喜欢
                  • 2017-02-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-29
                  • 2015-09-08
                  • 2014-11-11
                  • 2019-02-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多