vscode开发android ndk的环境配置

news2024/9/20 22:37:13

vscode开发android ndk的环境配置

最近公司新需求,要求用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++ plugin

Cmake支持

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

Cmake plugin

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

Cmake Tools plugin

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

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

环境配置

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

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

Cmd + Shfit + P,输入edit configuration

cpp configuration search

编辑c_cpp_properties.json配置文件:

cpp configuration

这里我添加了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这个编译环境配置了:

cpp configuration status bar

Cmake Tools配置

使用CMake Tools启动调试

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

vs launch config menu

添加启动配置:

vs launch config

修改点:

  • 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 kits search

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

cmake tools kits

添加自定义的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配置。

cmake tools kits status bar

但是大家都知道,在写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:

cmake tools variant status bar

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

cmake tools variant config

这样我们需要编译不同的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
}

参考

  • CMake Tools for Visual Studio Code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloudAlibaba基础七-2 seata的使用

一 Seata 是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。AT模式是阿里首推的模式,阿里云上有商用版本的GTS&#x…

pycharm创建文件自动生成文件头信息

pycharm创建文件自动生成文件头信息 1、设置步骤 file -> settings->Editor->File and Code Templates->Python Script 2、pycharm预定义的变量&#xff08;小写无效&#xff09; ${PROJECT_NAME}:项目名称${PRODUCT_NAME}:集成开发环境${NAME}:文件名${USER…

高效工作与持续学习:程序员如何平衡成长与编码任务?

在当今瞬息万变的技术世界中&#xff0c;程序员面临着前所未有的挑战和机遇。随着项目复杂性的增加和新技术的层出不穷&#xff0c;如何在繁忙的日常编码任务与自我提升之间找到平衡&#xff0c;已成为许多程序员心中的困惑。这不仅关乎职业生涯的发展&#xff0c;更关系到个人…

Transformer系列-3丨BERT模型和代码解析

1 前言 前面两篇文章&#xff0c;笔者从网络结构和代码实现角度较为深入地和大家解析了Transformer模型和Vision Transformer模型&#xff08;ViT&#xff09;&#xff0c;其具体的链接如下&#xff1a; 基础Transformer解析 ViT模型与代码解析 本期内容&#xff0c;笔者想…

贪心+构造,CF 1592F1 - Alice and Recoloring 1

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1592F1 - Alice and Recoloring 1 二、解题报告 1、思路分析 操作2、3可以…

C++系列-多态的基本语法

多态的基本语法 多态的含义静态多态动态多态 多态的底层原理多态中的final和overridefinaloverride: 多态的应用和优点计算器简单实现电脑组装的实现 《游山西村》 南宋陆游 莫笑农家腊酒浑&#xff0c;丰年留客足鸡豚。 山重水复疑无路&#xff0c;柳暗花明又一村。 箫鼓追…

leetcode118. 杨辉三角,老题又做

leetcode118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1…

AI视频创作应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

appium下载及安装

下载地址&#xff1a;https://github.com/appium/appium-desktop/releases 双击安装就可以

信号的变换

信号的变换 在实践中&#xff0c;缩放和时间平移是遇到的两个最重要的信号变换。缩放改变了振幅轴上的因变量的值&#xff0c;而时间平移则影响了时间轴上的自变量的值。 加法 对于两个离散时间信号的加法&#xff0c;例如 x [ n ] x[n] x[n] 和 y [ n ] y[n] y[n]&#x…

Flutter【02】mobx原理

简介&#xff1a; 概念 MobX 区分了以下几个应用中的概念&#xff1a; State(状态) 状态 是驱动应用的数据。 通常有像待办事项列表这样的领域特定状态&#xff0c;还有像当前已选元素的视图状态。 记住&#xff0c;状态就像是有数据的excel表格。 Derivations(衍生) 任何…

Ps:首选项 - 性能

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“性能” Performance选项卡允许用户通过调整内存使用、GPU 设置、高速缓存设置以及多线程处理等选项&#xff0c;来优化 Photoshop 的性能。这对于处理大文件、复杂图像或需要…

Python 数据分析之Numpy学习(一)

Python 数据分析之Numpy学习&#xff08;一&#xff09; 一、Numpy的引入 1.1 矩阵/向量的按位运算 需求&#xff1a;矩阵的按位相加 [0,1,4] [0,1,8] [0,2,12] 1.1.1 利用python实现矩阵/向量的按位运算 # 1.通过列表实现 list1 [0, 1, 4] list2 [0, 1, 8]# 列表使用…

(17)ELK大型储存库的搭建

前言&#xff1a; els是大型数据储存体系&#xff0c;类似于一种分片式存储方式。elasticsearch有强大的查询功能&#xff0c;基于java开发的工具&#xff0c;结合logstash收集工具&#xff0c;收集数据。kibana图形化展示数据&#xff0c;可以很好在大量的消息中准确的找到符…

Marimo:下一代Python编程环境,颠覆传统Jupyter笔记本,自动化执行所有依赖代码块,告别繁琐手动操作

Marimo 是一个颠覆传统笔记本的全新编程环境&#xff0c;它以其反应式、交互式、可执行和可共享等特性&#xff0c;为开发者们带来前所未有的编程体验。Marimo 确保您的笔记本代码、输出和程序状态始终保持一致。它解决了传统笔记本&#xff08;如 Jupyter&#xff09;的许多问…

流媒体服务器如何让WebRTC支持H.265,同时又能支持Web js硬解码、软解码(MSE硬解、WASM软解)

为了这一整套的解决方案&#xff0c;调研研发整整花费了差不多半年多的时间&#xff0c;需达成的目标&#xff1a; 流媒体服务器端不需要将H.265转码成H.264&#xff0c;就能让Chrome解码播放H.265&#xff1b; 注意&#xff1a;现在很多市面上的软硬件通过转码H.265成H.264的…

CSP-CCF 202312-1 仓库规划

一、问题描述 二、解答 思路&#xff1a;定义二维数组&#xff0c;比较不同行的相同列数 代码如下&#xff1a; #include<iostream> using namespace std; int main() {int n, m;cin >> n >> m;int a[1001][11] { 0 };for (int i 1; i < n; i){for (…

贪心 + 分层图bfs,newcoder 76652/B

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 https://ac.nowcoder.com/acm/contest/76652/B 二、解题报告 1、思路分析…

ELK基础搭建

一、认识ELK ELK是一套开源的日志分析系统&#xff0c;由elasticsearchlogstashKibana组成。 官网说明&#xff1a;https://www.elastic.co/cn/products 首先: 先一句话简单了解 E&#xff0c;L&#xff0c;K 这三个软件 elasticsearch: 分布式搜索引擎 logstash: 日志收集与…

领英(LinkedIn)公司主页创建方法分享

上次写了几篇关于领英注册的文章&#xff0c;也是有不少人加我&#xff0c;说有用。当然了也有还是不行的&#xff0c;还是不行的话一般都是比较复杂的问题&#xff0c;需要一些技术性的手段去解决。 然后最近也是有一些外贸朋友问公司主页注册创建的一些事情&#xff0c;今天的…