前言
作为一名专业Android开发者, 当我们遇到需要C/C++的开发时, 完全可以直接使用Android Studio, 而不用另外下载诸如CLion AppCode等收费IDE
使用Android Studio的好处有:
- 免费:
JetBrains的软件大部分都是收费的 唯独Android Studio完全免费使用 Gradle天然支持C语言的编译:Gradle不仅可以编译GroovyJava和Kotlin, 还可以编译C/C++、Scala和Swift, 未来还会支持更多语言, 潜力无限- 节省电脑资源: 无需装多个
IDE, 一个Android Studio就可以搞定AndroidWeb和C的开发 你说爽不爽
说了这么多好处, 接来了咱们来聊聊如何实现Android Studio的C/C++开发
实现步骤
创建一个空工程, 默认选择
Android空Activity工程即可, 然后将一些用不上的文件都清除, 最后目录结构如下: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在
App目录下的build.gradle中的内容全部清除 然后填入以下内容:1
2
3
4
5
6
7
8
9
10
11
12apply plugin: 'c'
model {
components {
main(NativeExecutableSpec) {
}
}
}
dependencies {
}同样的 如果是C++, 则将plugin改成cpp, 如下:
1
2
3
4
5
6
7
8
9
10
11
12apply plugin: 'cpp'
model {
components {
main(NativeExecutableSpec) {
}
}
}
dependencies {
}gradle同步之后, 右侧gradle task面板中会生成三个task:
此时我们尝试编写C代码
1
2
3
4
5
6
int main(int argc, char** argv){
printf("Hello World!\n");
return 0;
}编写完后 运行
gradle task中的build, 就会自动对源码进行编译并生成可执行文件, 该文件我们可以在build目录中找到
打开文件 双击运行, 此时控台输出
Hello World
构建执行流程优化
编译结束后自动执行程序
修改
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
25apply plugin: 'c'
model {
components {
main(NativeExecutableSpec) {
println("开始编译...")
}
}
}
task execProgram(){
doLast {
println("开始执行...")
exec {
commandLine("./build/exe/main/main")
}
}
}
build.finalizedBy(execProgram)
dependencies {
}这样, 点击
build任务之后就会自动执行程序了, 如果只想重复执行程序 不进行重新编译, 那么单独执行execProgram任务即可:
增加代码错误提示功能
虽然c/c++程序可以正常编译执行了, 但是代码在编写过程中并没有语法错误提示, 在这种环境下写代码的体验会比较差
接下来 我们把该功能实现, 这里需要配合android插件以及cmake构建工具:
下载
NDK和cmake工具

配置
build.gradle增加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15apply plugin: 'com.android.application'
android{
compileSdkVersion 30
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
defaultConfig {
//需要限制最小库版本不能太低 不然有些c库可能缺失
minSdkVersion 21
targetSdkVersion 30
}
}在
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})在
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>同步工程
同步刷新
gradle工程后, 此时我们发现c目录下的源码可以语法错误提示了, 并且代码自动补全功能也有了
实现交叉编译
经过上面如此一番配置之后, 相当于结合了gradle和cmake两大构建工具,可以说是强大无比
我们既可以使用gradle执行execProgram任务生成本地平台的可执行文件, 同时还可以使用cmake交叉编译生成android平台的执行文件和动态库文件
我们只需编译工程或者执行build任务, 即可自动生成执行文件和动态库, 同时动态库会被gradle工具自动打包进apk文件中


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