如何使gradle忽略c++;文件夹? 我的应用程序使用JNI来做一些本地工作,所有的C++文件都在//SRC/main/JNI中, externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } }

如何使gradle忽略c++;文件夹? 我的应用程序使用JNI来做一些本地工作,所有的C++文件都在//SRC/main/JNI中, externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } },android,android-ndk,Android,Android Ndk,以我的身材,格雷德尔 在我所有的同事要求我将jni变成一个库,这样他们就可以在不下载ndk的情况下构建apk之前,一切都很好 所以我使用ndk构建,库在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 integ

以我的身材,格雷德尔

在我所有的同事要求我将jni变成一个库,这样他们就可以在不下载ndk的情况下构建apk之前,一切都很好

所以我使用ndk构建,库在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文件

有什么想法吗?

我是这样包装的:

if (ndkDirectory) {
  externalNativeBuild {
     ndkBuild {
       path 'src/main/jni/Android.mk'
    }
  }
}
但是如果AS可以在标准位置src/main/jni中找到cpp文件,它仍然会抱怨,并且在android块关闭后,我在build.gradle中禁用了NDK编译任务

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
    }
  }
}
我是这样包装的:

if (ndkDirectory) {
  externalNativeBuild {
     ndkBuild {
       path 'src/main/jni/Android.mk'
    }
  }
}
但是如果AS可以在标准位置src/main/jni中找到cpp文件,它仍然会抱怨,并且在android块关闭后,我在build.gradle中禁用了NDK编译任务

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
    }
  }
}

受到@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文件。

受到@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文件。

我猜只有android块可以读取ndkDirectory变量,那么任务块中的ndkDirectory如何获取ndkDirectory值呢?只有android块可以读取ndkDirectory变量-Correct。现在修好了。@Alex Cohn,受你的代码启发,我想出了一种处理编译器抱怨问题的方法,我将把它作为一个答案发布,你来复习一下。我猜只有android block可以读取ndkDirectory变量,那么任务块中的NdkDirectory如何获取NdkDirectory值呢?只有android块才能读取NdkDirectory变量-Correct。修正了。Alex Cohn,得到了你的代码的启发,我想出了一个解决编译器抱怨问题的方法,我把它作为一个答案,你是WORKE复习。我通常不想和SooSeCes混淆,因为即使我不想运行NDK构建,我仍然想看到C++源。但这是一个味觉的问题,你的方法会起作用。我通常不喜欢和SoeSeCes混淆,因为即使我不想运行NDK构建,我仍然想看到C++源。但这是一个品味问题,你的方法会奏效。