解决Flutter项目中CMake找不到NDK工具链文件的报错问题
解决Flutter中C++编译Android .so库的CMake路径错误问题
问题背景
要在Flutter项目中使用C代码,需将C文件编译为Android环境适用的.so共享库,执行以下CMake命令时持续报错:
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -G Ninja -DANDROID_NDK=$ANDROID_NDK -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-30 -Sandroid -Bbin/android/arm64-v8a
错误核心为$ANDROID_NDK路径未被正确解析,导致找不到source.properties文件、编译器工具等。
具体报错信息
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -G Ninja -DANDROID_NDK=$ANDROID_NDK -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM= android-30 -Sandroid -Bbin/android/arm64-v8a CMake Warning: Ignoring extra path from command line: "F:/dart ffi/ffiproject/.toolchain.cmake" CMake Warning at C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android-legacy.toolchain.cmake:51 (message): Using custom NDK path (ANDROID_NDK is set): F:/dart ffi/ffiproject/android/$ANDROID_NDK Call Stack (most recent call first): C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake:54 (include) F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/3.24.1/CMakeSystem.cmake:6 (include) CMakeLists.txt:5 (project) CMake Error at C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android-legacy.toolchain.cmake:64 (file): file failed to open for reading (No such file or directory): F:/dart ffi/ffiproject/android/$ANDROID_NDK/source.properties Call Stack (most recent call first): C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake:54 (include) F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/3.24.1/CMakeSystem.cmake:6 (include) CMakeLists.txt:5 (project) CMake Error at C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android-legacy.toolchain.cmake:69 (message): Failed to parse Android NDK revision: F:/dart ffi/ffiproject/android/$ANDROID_NDK/source.properties. Call Stack (most recent call first): C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake:54 (include) F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/3.24.1/CMakeSystem.cmake:6 (include) CMakeLists.txt:5 (project) CMake Error at C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android-legacy.toolchain.cmake:175 (include): include could not find requested file: F:/dart ffi/ffiproject/android/$ANDROID_NDK/build/cmake/platforms.cmake Call Stack (most recent call first): C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake:54 (include) F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/3.24.1/CMakeSystem.cmake:6 (include) CMakeLists.txt:5 (project) -- The C compiler identification is unknown -- The CXX compiler identification is unknown CMake Error at CMakeLists.txt:5 (project): The CMAKE_C_COMPILER: F:/dart ffi/ffiproject/android/$ANDROID_NDK/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe is not a full path to an existing compiler tool. Tell CMake where to find the compiler by setting either the environment variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH. CMake Error at CMakeLists.txt:5 (project): The CMAKE_CXX_COMPILER: F:/dart ffi/ffiproject/android/$ANDROID_NDK/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe is not a full path to an existing compiler tool. Tell CMake where to find the compiler by setting either the environment variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH. -- Configuring incomplete, errors occurred! See also "F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/CMakeOutput.log". See also "F:/dart ffi/ffiproject/bin/android/arm64-v8a/CMakeFiles/CMakeError.log".
当前CMakeLists.txt内容
cmake_minimum_required(VERSION 3.0.0) set(CMAKE_MAKE_PROGRAM "C:/src/ninja-win/ninja.exe" CACHE FILEPATH "" FORCE) set( CMAKE_CXX_COMPILER g++ ) set( CMAKE_C_COMPILER gcc ) project(ffiproject) add_library( lib SHARED lib.cpp ) find_library( lib log ) target_link_libraries( lib ${log_lib} )
解决方案
1. 确保ANDROID_NDK环境变量正确配置
- Windows系统中,打开系统属性-高级-环境变量,添加系统变量
ANDROID_NDK,值为你的NDK实际安装路径,例如:C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393 - 设置完成后,重启所有终端窗口,确保环境变量生效
2. 修正CMake命令中的路径问题
如果环境变量仍未生效,直接用绝对路径替换命令中的$ANDROID_NDK:
cmake -DCMAKE_TOOLCHAIN_FILE=C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake -G Ninja -DANDROID_NDK=C:/Users/super/AppData/Local/Android/Sdk/ndk/25.1.8937393 -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-30 -Sandroid -Bbin/android/arm64-v8a
3. 修复CMakeLists.txt中的错误
- 移除手动设置的
CMAKE_C_COMPILER和CMAKE_CXX_COMPILER:Android NDK的toolchain会自动配置clang编译器,手动指定g++/gcc会导致冲突 - 修正
find_library的变量名:原变量名lib与目标库名重复,改为log_lib避免命名冲突
修改后的CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0) set(CMAKE_MAKE_PROGRAM "C:/src/ninja-win/ninja.exe" CACHE FILEPATH "" FORCE) project(ffiproject) add_library( lib SHARED lib.cpp ) find_library( log_lib log ) target_link_libraries( lib ${log_lib} )
4. 清理旧构建缓存
删除bin/android/arm64-v8a目录,重新执行CMake命令,避免缓存中的错误路径干扰构建流程
内容的提问来源于stack exchange,提问作者Noob Coder
相关产品推荐
相关产品推荐

