教你配置VS Code开发Android的NDK环境方法

目录
文章目录隐藏
  1. 插件安装
  2. 环境配置

最近公司新需求,要求用 C/C++实现部分核心代码,打包成静态库跨平台(Android 和 iOS)使用。 作为 Android 开发出身的 C/C++老白程序员兴奋不已(又可以开心的学习 niubility 的 C/C++了),但之前写 JNI 代码的集成环境都是 Android Studio,最后打包生成的 so 库也是面向 Android 平台的。 有什么 IDE 适合这种跨平台开发的呢?请教了公司写 C 的大牛(独立开发了一套跑在单片机上的 Linux 操作系统的非著名程序员,emacs 发烧友),大牛说 C/C++并没有什么特好用的 IDE,用的人多的可能 Eclipse 算一个。 毕竟大神是 emacs 党,还需要 IDE? 可我一 VIM 党,也用 emacs 开发 C/C++? Sorry, I Can’t Do It

于是我就琢磨有啥其他选项,想着要不试试 VS Code,这家伙近些年混得风生水起的。然后,经过一番摸索后总算弄了一套 C/C++ + Cmake 的环境,分析给各位大佬们,有啥建议还请多赐教。

插件安装

用 VS Code 搭建开发环境,插件是必不可少的。

VS Code 对 C/C++的支持

这里我选择了 C/C++插件,官方提供的,应该值得信赖。

C/C++插件

Cmake 支持

编译工具这里我选择了 cmake,所以安装 Cmake 和 Cmake Tools 这两个插件。

Cmake 支持

Cmake 插件是让 VS Code 支持 Cmake 语言。

Cmake Tools 插件

而 Cmake Tools 插件则是能让 VS 提供各种 Cmake 编译相关的小工具,包括在底部状态栏显示一些快捷工具。

安装上述三个插件后,重启 VS Code 让插件生效。

环境配置

首先随便创建一个目录,作为项目根目录,以 Android 的 NDK 配置为例。

配置 VS Code 的 C/C++工具链

Cmd + Shfit + P,输入edit configuration

配置 VS Code 的 C/C++工具链

编辑c_cpp_properties.json配置文件:

c_cpp_properties.json 配置文件

这里我添加了 Android 配置:

 {
    "name": "Android",
    "includePath": [
        "${workspaceFolder}/src"
    ],
    "defines": [
    ],
    "compilerPath": "${env:ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++",
    "cStandard": "c11",
    "cppStandard": "c++17",
    "intelliSenseMode": "clang-x64",
    "configurationProvider": "ms-vscode.cmake-tools"
}

这里解释一下这几个重要配置项的作用:

  • name:配置名称,会显示在状态栏上。
  • includePath:VS Code 搜索 include 头文件的路径(后面会被 Cmake tools 取代)。
  • compilerPath:编译器路径,这里我选择的 llvm 的 clang。这也是目前 NDK 官方指定的,其他编译器都被 Google 删掉了…
  • configurationProvider:这个配置是告诉 VS code,让 Cmake Tools 插件根据 CMakeLists.txt 的配置来指定 C/C++的代码环境,如在 CMakeLists.txt 中配置了 link_directories(dir_xx)命令,VS Code 就能正确识别出 #Include<dir_xx/xxx.h>头文件。同时也就取代了上面的 includePath配置。

添加上面的配置后,状态栏左下角就可以选择 Android 这个编译环境配置了:

Android 编译环境配置

Cmake Tools 配置

使用 CMake Tools 启动调试

菜单依次选择 Run –> Add Configuration :

Cmake Tools 配置

添加启动配置:

启动配置

修改点:

  • program:启动的二进制程序路径
  • environment:启动时的环境变量配置

完成以上配置后,编写 C/C++和 CMakeLists.txt 代码,就可以Cmd + Shfit + P依次执行 Cmake Configure、Cmake Build、编译出 C/C++的执行文件,然后Shift + F7选择执行目标运行程序,或者在 VS code 编辑器上加断点,Ctrl + F5 调试 C/C++代码了。

但这是常规的 C/C++项目的套路。可我们需要使用 NDK 交叉编译,于是我们还需要继续添加如下配置:

配置 Cmake Tools 的工具包

Cmd + Shfit + P,输入cmake edit user-local cmake kits

配置 Cmake Tools 的工具包

默认情况下,VS code 会生成如下配置项:

默认 VS code 生成配置项

添加自定义的 Cmake kits:

{
    "name": "Clang Android",
    "compilers": {
      "C": "/Users/jay/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang",
      "CXX": "/Users/jay/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++"
    },
    "environmentVariables": {
      "ANDROID_NDK": "/Users/jay/Library/Android/sdk/ndk-bundle"
    },
    "toolchainFile": "${env:ANDROID_NDK}/build/cmake/android.toolchain.cmake",
    "cmakeSettings": {
      "CMAKE_INSTALL_PREFIX": "${workspaceFolder}/out/android/${variant:buildType}/${variant:abi}",
      "ANDROID_TOOLCHAIN": "clang",
      "ANDROID_NATIVE_API_LEVEL": 21,
      "ANDROID_STL": "c++_shared",
      "ANDROID_ABI": "armeabi-v7a",
      "ANDROID_CPP_FEATURES": "rtti exceptions"
    }
  }

配置参数的意思基本上看名字就能猜出来是什么意思,需要单独解释的是 cmakeSettings 这个参数,这里面配置的参数会在执行 cmake 命令时以-Dname=val的形式传入参数(如"ANDROID_ABI": "armeabi-v7a"在编译时,则会变成-DANDROID_ABI=armeabi-v7a传入),所以这里我们可以自定义合适的参数传入 Cmake 用于构建。配置完成后,可在状态栏选择我们的“Clang Android” Kits 配置。

状态栏的“Clang Android” Kits 配置

但是大家都知道,在写 JNI 代码时,往往需要针对不同的 CPU 架构编译不同的 so 库,难道需要每次修改这里的配置参数吗?当然有更优秀的方法!是时候向大家介绍CMake Variants这个家伙了。

CMake Variants 配置

variants 的相关配置可以放到cmake-variants.yaml或者cmake-variants.json,这两者只是格式不一样,效果和配置规则是一样的。这里我们采用yaml的文件格式。 这个文件可以放到工程根目录或者.vscode/目录里。

Cmake Tools 的默认 varant 配置是这样的:

{
    "buildType": {
        "default": "debug",
        "description": "The build type.",
        "choices": {
        "debug": {
            "short": "Debug",
            "long": "Disable optimizations - include debug information.",
            "buildType": "Debug"
        },
        "release": {
            "short": "Release",
            "long": "Optimize for speed - exclude debug information.",
            "buildType": "Release"
        },
        "minsize": {
            "short": "MinSizeRel",
            "long": "Optimize for smallest binary size - exclude debug information.",
            "buildType": "MinSizeRel"
        },
        "reldeb": {
            "short": "RelWithDebInfo",
            "long": "Optimize for speed - include debug information.",
            "buildType": "RelWithDebInfo"
        }
        }
    }
}

默认为我们提供了几种打包配置,我们可以扩展一下,新建配置文件projectName/.vscode/cmake-variant.json,添加如下配置:

{
  "buildType": {
    "default": "debug",
    "description": "The build type.",
    "choices": {
      "debug": {
        "short": "Debug",
        "long": "Disable optimizations - include debug information.",
        "buildType": "Debug"
      },
      "release": {
        "short": "Release",
        "long": "Optimize for speed - exclude debug information.",
        "buildType": "Release"
      }
    }
  },
  "abi": {
    "default": "armeabi-v7a",
    "description": "abi for android build",
    "choices": {
      "armeabi-v7a": {
        "short": "armv7",
        "long": "abi for armeabi-v7a",
        "settings": {
          "ANDROID_ABI": "armeabi-v7a"
        }
      },
      "arm64-v8a": {
        "short": "arm64",
        "long": "abi for arm64-v8a",
        "settings": {
          "ANDROID_ABI": "arm64-v8a"
        }
      },
      "x86_64": {
        "short": "x86_64",
        "long": "abi for x86_64",
        "settings": {
          "ANDROID_ABI": "x86_64"
        }
      }
    }
  }
}

我们在settings配置项中添加了 ANDROID_ABI 参数,作用和 Cmake kits 中的cmakeSettings是一样的,这样我们可以删掉 cmake kits 中的 ANDROID_ABI 参数配置了。参数的详细信息可以参考CMake Variants,配置完成后,可在状态栏选择 variant:

状态栏选择 variant

点击 variant 选项,我们可以看到 2 x 3 = 6 种组合选项可供选择:

variant 选项

这样我们需要编译不同的 CPU 架构的 so 库时,选择不同的 variant 配置即可。

至此,我们就可以愉快的跨平台开发 C/C++代码了~

Additional

如果发现 android 相关的头文件引用和相关符号无法识别,可以在.vscode 文件夹中增加c_cpp_properties.json的配置文件,并增加以下配置。 加完配置后就可以在右下角的配置里选择 name 对应的配置项(我们这里是 Android)。

这个配置文件是给C/C++插件用的,所以需要安装C/C++插件才会起作用。

{
    "configurations": [
        {
            "name": "Android",
            "includePath": [
                 "${workspaceFolder}",
                 "/Users/mk/Library/Android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android/**"
            ],
            "defines": [],
            "compilerPath": "${env:ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

以上就是关于使用 VsCode 开发 android 的 ndk 的环境配置方法,希望对大家有帮助。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 教你配置VS Code开发Android的NDK环境方法

发表回复