【发布时间】:2017-01-22 13:24:00
【问题描述】:
错误:任务 ':app:compileDebugNdk' 执行失败。
错误:您的项目包含 C++ 文件,但未使用受支持的本机构建系统。 考虑将 CMake 或 ndk-build 与稳定的 Android Gradle 插件集成:
【问题讨论】:
标签: android-studio
错误:任务 ':app:compileDebugNdk' 执行失败。
错误:您的项目包含 C++ 文件,但未使用受支持的本机构建系统。 考虑将 CMake 或 ndk-build 与稳定的 Android Gradle 插件集成:
【问题讨论】:
标签: android-studio
看来你已经有了 C++ 代码和项目目录中的 Makefiles,在这种情况下,你只需要将 Gradle 链接到本机库:
从 下拉列表 中选择 CMake 或 ndk-build,具体取决于您的项目
一个。如果您选择 CMake,请在项目中指定 CMakeLists.txt 脚本
b.如果您选择 ndk-build,请指定 Android.mk。
来源: https://developer.android.com/studio/projects/add-native-code.html#existing-project
【讨论】:
如今的 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,或者禁用它。
第一个选项的最佳方法是described by Janman。
这些天我不推荐使用experimental plugin,因为我相信ndk-build 集成更强大。但是使用实验性插件可能更容易维护简单的项目。
或者,出于某种原因,您可以选择在 Android Studio 之外构建本机库。为了防止出现错误消息,我知道三个选项。
您可以禁用gradle任务:在build.gradle中,添加
tasks.all { task ->
if (task.name.startsWith('compile') && task.name.endsWith('Ndk')) {
task.enabled = false
}
}
您可以在 Android Studio 中hide the cpp files,例如
sourceSets {
main {
jni.srcDirs = []
}
}
这种方法的缺点是 cpp 文件没有被 Android Studio 索引。
另一个alternative 是将android.useDeprecatedNdk=true 添加到gradle.properties。不过,目前尚不清楚该标志将工作多长时间。
【讨论】:
新解决方案将此添加到您的 build.gradle(Module:app)
externalNativeBuild {
cmake {
version "3.12.0"
}
ndkBuild {
path 'src/main/jni/Application.mk'
}
}
【讨论】:
只需将android.useDeprecatedNdk=true 添加到 gradle.properties 文件即可。
【讨论】:
我这样解决了这个问题。 首先,不要在项目目录中创建任何空白。 然后编辑 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'
}
}
【讨论】:
在app中获取build.gradle并搜索
sourceSets {
main {
jni.srcDirs = ['src/main/jni', 'src/main/jniLBS/']
}
}
并评论这一行。
【讨论】:
将以下内容添加到 build.gradle(Module:app)
externalNativeBuild {
cmake {
version "3.12.0"
}
ndkBuild {
path 'build/intermediates/ndk/debug/Android.mk'
}
}
}
【讨论】:
非常重要的是删除 build.gradle (Module:app) 中的这一行。
sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }
【讨论】:
您必须关心 gradle(module.app) 中的 sourceSets,并查看 jni 的 lib 文件夹名称是什么 例如,我的文件夹名称是 jniLins,所以我不得不从 sourceSets 中删除 jni 文件夹,但最好的方法是将数组留空,以便它可以从 exixting 文件夹中读取 我的意思是而不是
sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }
写这个:
sourceSets { main { jni.srcDirs = [] } }
【讨论】:
您可以在多个地方放置一个表示不同含义的“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"
}
}
}
【讨论】:
不是最好的解决方案,但快速的方法是通过添加以下行在gradle.properties 中将“NDK 弃用”设置为 60 天:
android.deprecatedNdkCompileLease=1608114817403
【讨论】: