NDK报错:make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。...

本文介绍了解决在使用NDK编译Android so库时遇到的特定错误的方法。该错误通常由于Android.mk文件格式问题导致,尤其是在从Windows系统或网页复制文件时。文章提供了两种解决方案:一是使用vi编辑器清理文件中不可见的多余字符;二是重新编写Android.mk文件。

android开发用ndk编译so库时,有时直接从别的地方拷贝Android.mk文件,会报:

make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。

出现这个这个错误,可能是因为android.mk的文件格式可能是windows下拷贝,或是从网页copy,只要用vi在linux下打开Android.mk文件把行尾一些多余的看不见字符清除即可,或者重新打过Android.mk

Execution failed for task ':NewProject_1:generateJsonModelDebug'. > error when building with ndkBuild using D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\jni\Android.mk: Build command failed. Error while executing process C:\Users\Lenovo\AppData\Local\Android\Sdk\ndk\19.2.5345600\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\jni\Android.mk NDK_APPLICATION_MK=D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\jni\Application.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=1 APP_PLATFORM=android-16 NDK_OUT=D:/Dinging/Cocos_project/NewProject_1/build/jsb-link/frameworks/runtime-src/proj.android-studio/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib NDK_TOOLCHAIN_VERSION=clang NDK_MODULE_PATH=C:\ProgramData\cocos\editors\Creator\2.3.4\resources\cocos2d-x;C:\ProgramData\cocos\editors\Creator\2.3.4\resources\cocos2d-x\cocos;C:\ProgramData\cocos\editors\Creator\2.3.4\resources\cocos2d-x\external -j16 NDK_DEBUG=1 APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n} md "D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib\armeabi-v7a" >NUL 2>NUL || rem C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi-v7a] "Gdbserver ": "[arm-linux-androideabi] D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdbserver" copy /b/y "C:\Users\Lenovo\AppData\Local\Android\Sdk\ndk\19.2.5345600\build\\..\prebuilt\android-arm\gdbserver\gdbserver" "D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib\armeabi-v7a\gdbserver" > NUL C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi-v7a] "Gdbsetup ": "D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup" C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../prebuilt/windows-x86_64/bin/echo.exe "set solib-search-path D:/Dinging/Cocos_project/NewProject_1/build/jsb-link/frameworks/runtime-src/proj.android-studio/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a" > D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../prebuilt/windows-x86_64/bin/echo.exe "directory C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../toolchains/llvm/prebuilt/windows-x86_64/sysroot C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../sources/android/support C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../sources/cxx-stl/llvm-libc++ C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../sources/cxx-stl/llvm-libc++abi/include D:/Dinging/Cocos_project/NewProject_1/build/jsb-link/frameworks/runtime-src/proj.android-studio/app/jni/../../Classes C:/Users/Lenovo/AppData/Local/Android/Sdk/ndk/19.2.5345600/build//../sources/cxx-stl/llvm-libc++/include" >> D:\Dinging\Cocos_project\NewProject_1\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup process_begin: CreateProcess(NULL, "", ...) failed. make: *** No rule to make target `D:/Dinging/Cocos_project/NewProject_1/build/jsb-link/frameworks/runtime-src/proj.android-studio/app/jni/../../Classes/main.cpp', needed by `D:/Dinging/Cocos_project/NewProject_1/build/jsb-link/frameworks/runtime-src/proj.android-studio/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/cocos2djs/__/__/Classes/main.o'. Stop.
最新发布
08-16
<think>嗯,用户遇到了一个Android NDK构建错误,提示找不到jni/test.c文件。这个问题看起来是NDK编译过程中常见的路径配置错误。 用户提供的错误信息很关键:"No rule to make target 'jni/test.c'",说明构建系统在jni目录下找不到test.c源文件。结合引用[2]提到的NDK头文件问题和引用[3]的版本警告,可能涉及多个因素。 首先考虑最常见的三种情况:文件路径错误、编译脚本配置问题、环境变量异常。用户可能把test.c文件放错了位置,或者Android.mk里写了错误的路径。也可能是NDK版本兼容性问题,就像引用[3]中提到的minSdkVersion冲突那样。 从技术细节看,需要特别注意arm64-v8a这个架构目录的出现,说明用户在使用新设备架构。而引用[4]展示的类似错误里涉及路径拼接问题,提示检查文件路径中的斜杠方向也很重要。 用户应该是个Android开发者,正在做JNI开发。ta可能刚接触NDK构建系统,或者迁移到新开发环境时遇到了问题。情绪上可能有些挫败感,毕竟构建错误会中断开发流程。 解决方案需要分层次:先确认文件是否存在,再检查LOCAL_SRC_FILES的路径书写,最后验证NDK版本兼容性。特别要提醒用户注意Windows系统下反斜杠的转义问题,这在引用[1]的Windows路径示例中可见端倪。 顺便想到,如果用户是Mac环境(引用[4]提到过),还要注意文件名大小写敏感的问题。不过当前错误信息更指向路径配置错误。</think>根据错误信息 `No rule to make target 'jni/test.c'`,核心问题是 **NDK 构建系统无法在指定路径找到源文件 `test.c`**。以下是系统化的解决步骤: --- ### 🔍 逐步排查与解决 1. **📂 验证文件物理存在性** - 检查项目 `jni` 目录下是否确实存在 `test.c` 文件。 - **路径区分大小写**:Linux/macOS 系统需确保文件名大小写与编译脚本完全一致(如 `Test.c` ≠ `test.c`)。 - **文件扩展名**:确认是 `.c`(C 语言)而非 `.cpp`(C++)。 2. **🛠 检查 `Android.mk` 配置** 在 `jni/Android.mk` 中,确认 `LOCAL_SRC_FILES` 的路径声明正确: ```makefile LOCAL_SRC_FILES := test.c # ✅ 正确:文件在 jni 目录根下 # 或 LOCAL_SRC_FILES := subdir/test.c # ✅ 正确:文件在 jni/subdir 中 ``` **常见错误**❌: ```makefile LOCAL_SRC_FILES := jni/test.c # ❌ 错误:jni 已是当前目录,无需重复添加 ``` 3. **🔄 清理并重新构建** 执行以下命令清除缓存(Gradle 和 NDK): ```bash ./gradlew clean # 清理 Gradle 构建缓存 ndk-build clean # 清理 NDK 中间文件(若使用 ndk-build) rm -rf app/.cxx # 手动删除 CMake/Ninja 缓存目录 ``` 4. **📝 检查 `build.gradle` 链接配置** 若使用 CMake,确认源文件已包含在 `CMakeLists.txt`: ```cmake add_library(native-lib SHARED test.c # ✅ 直接引用 jni 目录下的文件 ) ``` 若使用 `ndk-build`,需在 `build.gradle` 中指定 `Android.mk` 路径: ```gradle android { externalNativeBuild { ndkBuild { path "src/main/jni/Android.mk" # ✅ 指向正确的 mk 文件 } } } ``` 5. **💻 文件编码与权限问题(Linux/macOS)** - 运行 `ls -l jni/test.c` 确认文件可读。 - 异常时执行:`chmod 644 jni/test.c`。 6. **🔧 NDK 版本兼容性** 检查 `app/build.gradle` 中的 NDK 版本是否与本地安装一致: ```gradle android { ndkVersion "25.1.8937393" # 需与本地 NDK 目录名匹配 } ``` --- ### ⚠️ 关键注意事项 - **路径深度**:NDK 默认以 `jni` 目录为根,编译脚本中**无需包含 `jni/` 前缀**。 - **Windows 路径分隔符**:若在 Windows 开发,确保路径使用正斜杠 `/` 而非反斜杠 `\`(如 `subdir/test.c`✅)。 - **构建系统选择**:错误信息中的 `obj/local/arm64-v8a/objs` 表明使用 `ndk-build`(而非 CMake),需重点检查 `Android.mk`[^3]。 --- ### 🔄 验证流程 1. 移动 `test.c` 到正确位置:`<project>/app/src/main/jni/test.c` 2. 修正 `Android.mk`:`LOCAL_SRC_FILES := test.c` 3. 执行: ```bash ./gradlew clean ./gradlew assembleDebug ``` --- ### 📚 相关问题 1. **如何解决 `NDK undefined reference to` 链接错误?** > 通常由缺失库依赖或符号命名混淆(C/C++混合)导致,需检查 `LOCAL_LDLIBS` 和 `extern "C"` 使用[^2]。 2. **Android Studio 如何切换 NDK 版本?** > 在 `Project Structure > SDK Location` 中修改 NDK 路径,或通过 `android.ndkVersion` 在 `build.gradle` 指定版本号[^3]。 3. **`APP_PLATFORM` 版本高于 `minSdkVersion` 有何风险?** > 可能引发低版本设备崩溃(如使用高版本 API),需在 `Application.mk` 中设置 `APP_PLATFORM := android-<minSdk>` 对齐版本[^3]。 4. **JNI 开发中如何避免头文件解析失败?** > 需在 `Android.mk` 添加 `LOCAL_C_INCLUDES := $(LOCAL_PATH)/include` 指定头文件目录,并使用 `#include <test.h>` 引用[^2]。 --- > 提示:若问题持续,检查项目是否包含**空格或特殊字符的路径**(如 `My Project`),建议改为下划线命名(`My_Project`)避免解析错误[^4]。 [^1]: 构建路径需与项目物理结构一致 [^2]: JNI/NDK 头文件与符号解析依赖正确配置 [^3]: NDK 版本与平台目标需匹配 `minSdkVersion` [^4]: 构建系统对特殊字符路径处理存在兼容性问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值