前言
作为一名专业Android
开发者, 当我们遇到需要C/C++
的开发时, 完全可以直接使用Android Studio
, 而不用另外下载诸如CLion
AppCode
等收费IDE
使用Android Studio
的好处有:
- 免费:
JetBrains
的软件大部分都是收费的 唯独Android Studio
完全免费使用 Gradle
天然支持C语言的编译:Gradle
不仅可以编译Groovy
Java
和Kotlin
, 还可以编译C/C++
、Scala
和Swift
, 未来还会支持更多语言, 潜力无限- 节省电脑资源: 无需装多个
IDE
, 一个Android Studio
就可以搞定Android
Web
和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
文件中
本文为作者原创转载时请注明出处 谢谢