使用NDK的Cmake编译报错:Invalid Android NDK revision

在Windows上,下载Android的SDK之后,其自带有NDK,同时有CMake。当我们使用cmake.exe程序编译项目时,假如使用如下编译语句

E:\Android\Sdk\cmake\3.10.2.4988404\bin\cmake.exe -DCMAKE_TOOLCHAIN_FILE=E:\Android\Sdk\cmake\3.10.2.4988404\android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_NDK=E:\Android\Sdk\ndk-bundle\ -DCMAKE_GENERATOR="Ninja" -DCMAKE_MAKE_PROGRAM=E:\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe ./

则其会报类似错误如下

CMake Error at E:/Android/Sdk/cmake/3.10.2.4988404/android.toolchain.cmake:356 (message):  Invalid Android NDK revision (should be 12): 19.2.5345600.Call Stack (most recent call first):  E:/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake:94 (include)  CMakeLists.txt:30 (project)CMake Error: CMAKE_C_COMPILER not set, after EnableLanguageCMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguageCMake Error: CMAKE_ASM_COMPILER not set, after EnableLanguage-- Configuring incomplete, errors occurred!

我们顺着错误,打开E:/Android/Sdk/cmake/3.10.2.4988404/android.toolchain.cmake,定位到356行,代码如下

string(REGEX REPLACE "${ANDROID_NDK_SOURCE_PROPERTIES_REGEX}" "\\1"ANDROID_NDK_PACKAGE_REVISION "${ANDROID_NDK_SOURCE_PROPERTIES}")if(NOT ANDROID_NDK_PACKAGE_REVISION MATCHES "^${ANDROID_NDK_REVISION}\\.")message(FATAL_ERROR "Invalid Android NDK revision (should be ${ANDROID_NDK_REVISION}): ${ANDROID_NDK_PACKAGE_REVISION}.")endif()

显然,报错的原因是ANDROID_NDK_PACKAGE_REVISIONANDROID_NDK_REVISION不匹配,其分别为1912,其中前者为我们当前使用的NDK版本。而后者的12是怎么来的呢?我们在脚本搜索,发现其在脚本的开头就有设置

cmake_minimum_required(VERSION 3.6.0)set(ANDROID_NDK_REVISION 12)

这样,自然就不能匹配。那么原因是啥呢?估计是因为cmake是作为一个单独的模块在维护,而没有保持同步,因为CMake官方的版本已经到3.18了,而Android SDK中的才为3.10,它引入cmake这个版本的时候,估计刚好是对应的NDK 12,所以也就有这个限制。那么,是不是我们直接把set(ANDROID_NDK_REVISION 12)改为set(ANDROID_NDK_REVISION 19)就好了?我试了下,确实也是没问题的,可以顺利生成编译脚本build.ninja。但我们有更好的办法,来避免对源文件修改,以防未知错误。

解决

其实ndk-bundle目录下面就自带有android.toolchain.cmake文件,我们只需要这个文件就可以了

 E:\Android\Sdk\cmake\3.10.2.4988404\bin\cmake.exe -DCMAKE_TOOLCHAIN_FILE=E:\Android\Sdk\ndk-bundle\build\cmake\android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_NDK=E:\Android\Sdk\ndk-bundle\ -DCMAKE_GENERATOR="Ninja" -DCMAKE_MAKE_PROGRAM=E:\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe -DANDROID_PLATFORM=android-23

这样就可以顺利编译成功了。
那为什么使用这个文件就可以了呢?其原因不是因为在这个里面有set(ANDROID_NDK_REVISION 19),而是它根本就没有对NDK版本进行检查,它直接从NDK文件中读取当前NDK版本,然后检测其是否合法而已。

file(READ "${ANDROID_NDK}/source.properties" ANDROID_NDK_SOURCE_PROPERTIES)set(ANDROID_NDK_REVISION_REGEX  "^Pkg\\.Desc = Android NDK\nPkg\\.Revision = ([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta([0-9]+))?")if(NOT ANDROID_NDK_SOURCE_PROPERTIES MATCHES "${ANDROID_NDK_REVISION_REGEX}")  message(SEND_ERROR "Failed to parse Android NDK revision: ${ANDROID_NDK}/source.properties.\n${ANDROID_NDK_SOURCE_PROPERTIES}")endif()

更多相关文章

  1. 从android image中提取文件
  2. Android 版本
  3. Android版本差异
  4. android 读取ini文件
  5. android上传文件到服务器
  6. android文件操作工具类
  7. Android 简易文件选择Dialog
  8. 在Android中创建文件
  9. Android 删除指定文件代码

随机推荐

  1. Controls over the EditText and the IME
  2. android系统定制从听说到入门三
  3. Android(安卓)xml资源文件中@、@android:
  4. Android(安卓)中文API合集(4)(102篇)(chm
  5. android系统定制从听说到入门一
  6. Android(安卓)使用 TableLayout 布局拉伸
  7. android android:gravity 和 android:lay
  8. Android(安卓)中数据加密 ---- 3DES加密
  9. Android多进程之Binder的使用
  10. Android(安卓)SDK4.0离线快速安装方法