ninja: build stopped: subcommand failed. 20:27:00 ninja failed with: exit status 1
时间: 2025-07-28 15:36:17 浏览: 10
你遇到的错误:
```
ninja: build stopped: subcommand failed.
20:27:00 ninja failed with: exit status 1
```
表示在构建 Android NDK 项目时,Ninja 构建系统执行失败,返回了错误码 `1`。这通常意味着你的 **C/C++ 代码在编译或链接阶段出现了错误**,比如语法错误、未定义符号、头文件缺失、库未链接等。
---
## 🚫 错误原因分析
这个错误本身只是一个“**顶层错误提示**”,真正的原因隐藏在构建输出的 **详细日志中**。你需要找到 **具体的编译错误信息**,才能定位问题。
---
## 🔍 如何定位具体错误?
### ✅ 方法一:查看 Android Studio 的 Build 窗口
1. 打开 Android Studio。
2. 查看底部的 **Build** 窗口。
3. 展开 **"C/C++: Build Command Failed"** 部分。
4. 查找类似以下内容:
```
[arm64-v8a] Compile : native-lib <= native-lib.cpp
In file included from .../native-lib.cpp:10:
#include <android/native_window.h>
^~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
```
### ✅ 方法二:使用命令行查看详细日志
```bash
./gradlew assembleDebug --stacktrace
```
或:
```bash
./gradlew :app:externalNativeBuildDebug --stacktrace
```
---
## 🛠 常见导致 Ninja 构建失败的原因和解决方法
### 1. **找不到头文件(如 `android/native_window.h`)**
**错误信息:**
```
fatal error: 'android/native_window.h' file not found
```
**解决方法:**
确保你是在 Android NDK 环境中编译代码,而不是在普通 Linux/macOS 环境中使用 `g++` 编译。
- 检查 `CMakeLists.txt` 文件是否正确配置。
- 确保你使用的是 Android Studio 的 **External Native Build** 功能。
---
### 2. **未链接必要的库(如 `android`、`EGL`、`GLESv2`)**
**错误信息:**
```
undefined reference to `ANativeWindow_fromSurface'
```
**解决方法:**
在 `CMakeLists.txt` 中添加:
```cmake
target_link_libraries(
native-lib
android
EGL
GLESv2
log
)
```
---
### 3. **C/C++ 语法错误**
**错误示例:**
```cpp
ANativeWindow* window = surface; // 错误:不能直接赋值 jobject -> ANativeWindow*
```
**修复:**
```cpp
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
```
---
### 4. **NDK 版本不兼容**
**错误信息可能不明显,但构建失败。**
**解决方法:**
- 使用 Android Studio 推荐的 NDK 版本(通常在 SDK Manager 中)。
- 或者在 `local.properties` 中指定:
```properties
ndk.dir=/Users/yourname/Library/Android/sdk/ndk/25.1.8937393
```
---
## ✅ 示例:完整且正确的 CMakeLists.txt 配置
```cmake
cmake_minimum_required(VERSION 3.22.1)
project("native-window-example")
add_library(
native-lib
SHARED
native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries(
native-lib
android
EGL
GLESv2
${log-lib})
```
---
## ✅ 示例:native-lib.cpp
```cpp
#include <jni.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_render(JNIEnv *env, jobject /* this */, jobject surface) {
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
if (window == nullptr) {
return;
}
ANativeWindow_setBuffersGeometry(window, 0, 0, WINDOW_FORMAT_RGBA_8888);
ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(window, &buffer, nullptr) < 0) {
ANativeWindow_release(window);
return;
}
// 填充红色
uint32_t *pixels = static_cast<uint32_t *>(buffer.bits);
for (int i = 0; i < buffer.width * buffer.height; ++i) {
pixels[i] = 0xFFFF0000; // ARGB
}
ANativeWindow_unlockAndPost(window);
ANativeWindow_release(window);
}
```
---
##
阅读全文
相关推荐




















