使用Android Studio进行C/C++的开发

前言

作为一名专业Android开发者, 当我们遇到需要C/C++的开发时, 完全可以直接使用Android Studio, 而不用另外下载诸如CLion AppCode等收费IDE

使用Android Studio的好处有:

  • 免费: JetBrains的软件大部分都是收费的 唯独Android Studio 完全免费使用
  • Gradle天然支持C语言的编译: Gradle不仅可以编译Groovy JavaKotlin, 还可以编译C/C++ScalaSwift, 未来还会支持更多语言, 潜力无限
  • 节省电脑资源: 无需装多个IDE, 一个Android Studio就可以搞定Android WebC的开发 你说爽不爽

说了这么多好处, 接来了咱们来聊聊如何实现Android StudioC/C++开发

实现步骤

  1. 创建一个空工程, 默认选择AndroidActivity工程即可, 然后将一些用不上的文件都清除, 最后目录结构如下:

    1
    2
    3
    4
    5
    6
    .
    |-- build.gradle
    `-- src
    `-- main
    `-- c
    `-- hello.c

    如果是C++开发, 那么目录名改成cpp, 其结构如下:

    1
    2
    3
    4
    5
    6
    .
    |-- build.gradle
    `-- src
    `-- main
    `-- cpp
    `-- hello.cpp
  2. App目录下的build.gradle中的内容全部清除 然后填入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apply plugin: 'c'

    model {
    components {
    main(NativeExecutableSpec) {
    }
    }
    }

    dependencies {

    }

    同样的 如果是C++, 则将plugin改成cpp, 如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apply plugin: 'cpp'

    model {
    components {
    main(NativeExecutableSpec) {
    }
    }
    }

    dependencies {

    }
  3. gradle同步之后, 右侧gradle task面板中会生成三个task:

    image-20220916122044974

  4. 此时我们尝试编写C代码

    1
    2
    3
    4
    5
    6
    #include <stdio.h>

    int main(int argc, char** argv){
    printf("Hello World!\n");
    return 0;
    }
  5. 编写完后 运行gradle task中的build, 就会自动对源码进行编译并生成可执行文件, 该文件我们可以在build目录中找到

    image-20220916122359799

  6. 打开文件 双击运行, 此时控台输出Hello World

    image-20220916122515283

构建执行流程优化

  1. 编译结束后自动执行程序

    修改build.gradle文件内容如下即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    apply plugin: 'c'

    model {
    components {
    main(NativeExecutableSpec) {
    println("开始编译...")

    }
    }
    }
    task execProgram(){
    doLast {
    println("开始执行...")
    exec {
    commandLine("./build/exe/main/main")
    }
    }

    }

    build.finalizedBy(execProgram)

    dependencies {

    }

    这样, 点击build任务之后就会自动执行程序了, 如果只想重复执行程序 不进行重新编译, 那么单独执行execProgram任务即可:

    image-20220916181048724

增加代码错误提示功能

虽然c/c++程序可以正常编译执行了, 但是代码在编写过程中并没有语法错误提示, 在这种环境下写代码的体验会比较差

接下来 我们把该功能实现, 这里需要配合android插件以及cmake构建工具:

  1. 下载NDKcmake工具

    image-20220928141059262

    image-20220928141148055

  2. 配置build.gradle

    增加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apply plugin: 'com.android.application'
    android{
    compileSdkVersion 30
    externalNativeBuild {
    cmake {
    path "CMakeLists.txt"
    }
    }
    defaultConfig {
    //需要限制最小库版本不能太低 不然有些c库可能缺失
    minSdkVersion 21
    targetSdkVersion 30

    }
    }
  3. build.gradle同级目录下创建CMakeLists.txt文件

    并添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 限定cmake最小版本号 当前使用的版本必须在这个之上
    cmake_minimum_required(VERSION 3.10.2)

    # 描述工程名称
    project("cproject")

    # 自定义变量 使用${变量名}进行引用
    set(BINARY_NAME "android-lib")
    set(EXEC_NAME "androidexc")


    #获取指定目录下源文件列表,保存到 `DIR_SRCS` 变量中
    aux_source_directory(${PROJECT_SOURCE_DIR}/src/main/c DIR_SRCS)

    # 生成可执行文件
    add_executable(${EXEC_NAME} ${DIR_SRCS})

    # 生成动态链接库
    add_library( # 动态库名称
    ${BINARY_NAME}

    # 生成动态库
    SHARED

    # 被编译进入库中的源码文件
    ${DIR_SRCS})
  4. main目录下创建AndroidManifest.xml文件

    并添加以下内容, 包名自定义:

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="自定义包名">
    </manifest>
  5. 同步工程

    同步刷新gradle工程后, 此时我们发现c目录下的源码可以语法错误提示了, 并且代码自动补全功能也有了

    image-20220928170120305

实现交叉编译

经过上面如此一番配置之后, 相当于结合了gradlecmake两大构建工具,可以说是强大无比

我们既可以使用gradle执行execProgram任务生成本地平台的可执行文件, 同时还可以使用cmake交叉编译生成android平台的执行文件和动态库文件

我们只需编译工程或者执行build任务, 即可自动生成执行文件和动态库, 同时动态库会被gradle工具自动打包进apk文件中

image-20220928171158748

image-20220928171103061

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%