【问题标题】:How to make gradle ignore c++ files?如何让 gradle 忽略 c++ 文件?
【发布时间】:2018-05-12 16:13:53
【问题描述】:

我的应用使用 JNI 做一些原生工作,所有的 c++ 文件都在 /src/main/jni 中

externalNativeBuild {
    ndkBuild {
       path 'src/main/jni/Android.mk'
    }
}

在我的 build.gradle 中。

一切正常,直到我所有的同事都要求我将 jni 设为库,这样他们就可以在不下载 ndk 的情况下构建 apk。

所以我使用 ndk-build 并在 src/main/libs 中生成库。但是当我构建 apk 时,gradle 说:

> Error: Your project contains C++ files but it is not using a supported native build system.
  Consider using CMake or ndk-build integration. For more information, go to:
   https://d.android.com/r/studio-ui/add-native-code.html
  Alternatively, you can use the experimental plugin:
   https://developer.android.com/r/tools/experimental-plugin.html

我想要的是将源代码保留在 jni 中,手动构建库,并使 Gradle 忽略 cpp 文件。

有什么想法吗?

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    受到@Alex Cohn 的启发,我想出了一个主意:

    sourceSets {
        main {
            if (!android.ndkDirectory) {
                jniLibs.srcDirs = ["src/main/libs"]
                jni.srcDirs = []
            } else {
                jniLibs.srcDirs = []
            }
        }
    }
    
    if (ndkDirectory) {
        externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }
    }
    

    jni.srcDirs = [] 将使编译器忽略 jni 文件。

    【讨论】:

    • 我通常不喜欢弄乱 sourceSets,因为即使我不想运行 ndk-build,我仍然想请参阅 C++ 源代码。但这是一个品味问题,你的方法会奏效。
    【解决方案2】:

    我是这样包装的:

    if (ndkDirectory) {
      externalNativeBuild {
         ndkBuild {
           path 'src/main/jni/Android.mk'
        }
      }
    }
    

    但是如果 AS 可以在标准位置 src/main/jni 中找到 cpp 文件,它仍然会报错,我最后在 build.gradle 中禁用了 NDK 编译任务,在android 块已关闭。

    tasks.all {
      task ->
        if (!android.NdkDirectory) {
          if (task.name.endsWith('Ndk') || task.name.startsWith('externalNativeBuild')) {
            task.enabled = false  // Android Studio will complain about c++ files when NDK is not installed
        }
      }
    }
    

    【讨论】:

    • 我猜只有android block可以读取ndkDirectory变量,那么tasks block中的NdkDirectory是如何获取ndkDirectory值的呢?
    • 只有 android 块可以读取 ndkDirectory 变量 - 正确。现已修复。
    • @Alex Cohn,从你的代码中得到启发,我想出了一种处理编译器抱怨问题的方法,我将它作为答案发布,欢迎你来评论。
    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2016-07-28
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多