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 应用 )(代码

android studio NDK配置

从 3.6 更新到 Android Studio 4.0 后构建具有 NDK 支持的项目时出错

Android Studio 3.0.1不会构建NDK静态库