Android Studio 构建 NDK 项目非零退出值失败
Posted
技术标签:
【中文标题】Android Studio 构建 NDK 项目非零退出值失败【英文标题】:Android Studio failed build NDK project non-zero exit value 【发布时间】:2015-06-18 17:54:16 【问题描述】:我将我正在处理的项目从 Eclipse android SDK 环境导入到新的 Android Studio。 尝试运行项目我得到了这个
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'ndk/ndk-build'' finished with non-zero exit value 2
首先对我来说,看到这个错误很奇怪,因为之前在 Eclipse Android SDK 中工作,我自己运行 ndk-build,我仍然这样做。那么 Android Studio 现在是否正在为我运行 ndk-build?因为当我在终端中运行它时,我一点问题都没有,在这里它告诉我退出值错误。
然后我在网上搜索了一个“快速修复”,即创建一个空的 .c 文件,因为没有 .c 文件无法构建/运行 ndk 项目。毫不奇怪,这对我不起作用,因为 .jni 文件夹中有很多 .c 文件。
顺便提一下,我在 Yosemite 下的 Macbook Pro 上,项目本身应该没有问题。
提前感谢您的帮助。
【问题讨论】:
你找到解决办法了吗? 【参考方案1】:这是 Android Studio 的已知问题,由对启用 NDK 的项目的支持非常有限引起的。回答您的问题:是的,Android Studio 现在自行运行 ndk-build,但它忽略现有的 Android.mk 并即时生成一个(并且对于任何非平凡的启用 NDK 的项目都做错了)。实际上,解决此问题的最佳方法是禁用 Android Studio 的有限 NDK 支持并从 gradle 脚本调用 ndk-build。 Here我已经更详细地描述了它以及如何修复它。
【讨论】:
是的,太棒了,谢谢 您是制定总体规划的德米特里先生!非常感谢。我被困了几个小时。 android-studio preview 22 现在有部分包含 cmake\ndk-build makefiles @hay Dmitry 我有同样的问题,我尝试了我在网上找到的所有东西 2 天了!我什至在您的博客中尝试了示例,但仍然遇到相同的错误。任何想法/建议来解决这个问题? AS 上一个版本,gradle 2.2 目标和编译的 SDK 24 和 23 都试过了 我可以确认这发生在 AndroidStudio 2.3 和 InteliJ 2016.3 + Android 插件中。【参考方案2】:为简单起见,您可以尝试在 build.gradle 文件中将 sourceSets.main.jni.srcDirs = []
插入到 android
块中。这将告诉 gradle 在不同的路径中查找您的 C++ 文件。
【讨论】:
【参考方案3】:要查看确切的问题,请执行以下操作:1- 确保您已正确设置 ndk 路径,例如在我的项目中,我将 ndk.dir=/usr/local/opt/android-ndk-r13b
放入 local.properties
文件中2- 转到您的 android 应用的应用目录3- 运行以下命令:<ndk_build_path> -C <jni_path> NDK_OUT=<jniLibDir> all NDK_DEBUG=1
示例:
/usr/local/opt/android-ndk-r13b/ndk-build -C /MYAPP/app/src/main/jni -j 4 NDK_OUT=../jniLibs all NDK_DEBUG=1
然后你就可以看到出了什么问题。
【讨论】:
【参考方案4】:在将项目从windows导入mac时遇到同样的错误,我尝试了以上所有解决方案,都没有奏效。最后注意到有“多个目标模式”导致了这个错误。
解决方案:删除 NDK 中的“obj”文件夹并重建。
完成!!
【讨论】:
谢谢,这正是我的问题。令人惊讶的是,有多少不同的根本原因会触发此错误【参考方案5】:您可以禁用 compileDebugNdk,但在 Android Studio 中仍然可以看到 jni 文件夹。在您的 build.gradle 中,添加以下子句:
tasks.all task ->
if (task.name.startsWith('compile') && task.name.endsWith('Ndk'))
task.enabled = false
【讨论】:
【参考方案6】:我几乎尝试了所有可用的解决方案。我使用的是 Windows 10、Android Studio 1.5.1,唯一有效的是这里的解决方案 (http://answers.opencv.org/question/58551/androidstudiondk-finished-with-non-zero-exit-value2/)
在 Apps>build.gradle 中,将其添加到 android 对象下。
android
...
sourceSets
main
res.srcDirs = ['src/main/res']
jniLibs.srcDirs = ['src/main/jniLibs']
jni.srcDirs = [] // This prevents the auto generation of Android.mk
在此版本的 Android Studio 中,在 File>Project Structure>NDK Path 中添加 NDK 路径会自动将其添加到 local.properties 文件中,您不要编辑任何其他内容。
【讨论】:
@abggcv 您是否仍然遇到相同的非零退出错误?如果您使用的是 Windows,您可能希望避免文件夹路径的空格名称。这是我在某处学到的建议之一。还可以查看 Dmitry Moskalchuk 给出的 link 并从中查看 - 确保文件夹结构正确,如果 app/src/main/jni 中不存在 Android、mk 和 application.mk 文件,请创建它们。我使用以下教程设置opencv + 上述修改link希望这有帮助! 我正在使用 ubuntu。没有空格,但后来我发现当我从项目中删除 CMakeList 并仅使用 Android.mk 文件时问题得到了解决。实际上,在最新的 android studio 中提供了 C++ 支持,它会自动创建 cmake 文件并将其包含在 build.gradles 中。我习惯了 Android.mk 文件,所以我删除了 cmake 支持。我发现 this github 项目适用于最新的 android studio。【参考方案7】:我遇到了同样的问题,尝试了很多东西,但我发现:
命令行 ndkBuildPath, '-j8', '-C', file('src/main').absolutePath
请试试这个:
进入src/main/jni,打开终端运行命令:/home/.../Android/Sdk/ndk-bundle/ndk-build
它将构建并显示更多日志。你会发现你的代码有什么问题。
【讨论】:
以上是关于Android Studio 构建 NDK 项目非零退出值失败的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事
Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事
Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )(代码