前言
之前有介绍过在VS上开发安卓的.so, VS也提供了内嵌的项目模板, 非常简单. 唯一的不足之处在于, 开发的.so总得要配合某个APK来调用进行调试, 与我们开发PC应用很不同, 不能在控制台直接观测程序运行结果.
能否在安卓上直接开发控制台应用呢? 答案是肯定行. 这个我也给VS的团队提过意见, 希望能够补充这一块的项目模板, 毕竟安卓的C++和Java应用都有了, C++的.so, .a库也有了, 唯独缺少了控制台应用. 但是人微言轻, 目前也没啥进展, 所以就提供下我自己的方法, 用于安卓的C++控制台应用开发.
另外补充一句: 控制台应用仅适合用作调试目的, 不合适作为产品最终形态开发. 调试完成后需要生成.so或者.a集成到安卓apk中.
准备
虽然题目是VS2019, 但这只是表明我当前的VS版本, 实际需要的是VS的CMake项目模板, 这个应该从VS2017起就开始支持了.
另外由于是开发安卓的控制台应用所以还需要两个东西:
1. NDK(https://developer.android.com/ndk/downloads)
2. ADB(https://developer.android.com/studio/releases/platform-tools)
这两个东西请自行下载.
我这里的版本是 ndkVersion "21.0.6352462", adb使用的是Android Studio自带的. adb在Android studio的程序位置是: C:\Users\<你的用户名>\AppData\Local\Android\Sdk\platform-tools
这里我默认你已经完成了这两个工具的下载. 应该是不需要安装的,直接解压就可以了. 我的ndk和adb如下:
但是为了让VS能知道这两个东西的位置, 我们需要把他们添加到系统环境变量里面:
1. 打开系统环境变量:
2. 添加上面我的两个路径到Path下:
注意看路径, 如果你在对应路径下有以下三个.exe则没问题:
1. make.exe
2. clang.exe clang++.exe clang-cl.exe
3. adb.exe
最后顺便再说一句VS2019或者2017需要安装cmake扩展, 这个在我之前的文章里有介绍, 如果对VS的Cmake流程不清楚的, 建议先看看我之前的文章.
到这里准备工作就结束了, 顺便总结下: 安卓的C++编程属于Native语言, 需要用到NDK(N for native), 这个是安卓的native开发包, 里面主要包括了两个编译器: gcc和clang. 最新的安卓已经不支持gcc了,所以推荐使用clang作为编译器. 编译器编译好以后需要用到 Unix makefile作为程序的生成器, Windows下就用ndk自带的make.exe来替代make.而adb是作为与安卓设备的通讯调试工具, 可以进行文件的传输, 以及用shell启动对应的控制台应用打印出它的控制台输出到PC.
开始
1. 创建一个cmake项目
2. 首先说下代码部分和Windows或者Linux控制台一样的, 没有什么区别:
3. CMakeLists也一样不需要更改:
4. 重点在于修改配置:
a. 点击管理配置
b.这个界面下目前VS只提供了Linux和Windows的配置, Android的配置需要我们自己加
c. 修改Android-v8a-Debug的配置名
d. 清空工具集, 因为这里我们使用的是外部工具集, 不在VS的预定义里面:
下图中的"gcc-arm"改为""
ctrol+S 保存,然后关闭这个json文件
e. 再次打开管理配置, 检查下工具集是否为空
f. 填写工具链的cmake文件位置:
填写到下面:
g. 更新Cmake cache
成功以后这里也会切换成我们的配置名 Android-v8a-Debug:
5. 全部生成:
成功的控制台信息:
6. 发送到Android设备上运行:
a. 找到对应的控制台程序(Cmake的文件结构我之前的文章也有详细说明):
b. 在当前文件夹位置,运行adb push命令:
完整的命令是adb push AndroidTest /data/local/tmp
AndroidTest是当前PC的文件位置, /data/local/tmp是安卓端的目标位置. 注意其他的文件夹可能会有权限问题, /data/local/tmp下是调试安卓控制台程序不错的选择之一.
c. 使用adb shell运行我们push到安卓端的应用程序:
完整的命令是adb shell "cd /data/local/tmp && chmod 777 AndroidTest && ./AndroidTest"
adb shell 后面的""里的字符串就是安卓端的shell命令. &&表示三条命令依次执行: 首先切换路径到/data/local/tmp, 然后更改我push过去的应用程序的权限, 如果出现 permission denied, 那应该和这个chmod 777有关系. 最后./AndroiTest就是运行我们的控制台应用.
到这里, 整个VS生成安卓控制应用的流程就展示完了, 如果你有我之前CMake项目的文章的基础应该觉得很简单, 只是更改了配置文件而已.
另外至于调试的问题, 我在launch.vs.json下面只找到了RemoteLinux的配置, 没有安卓相关的配置, 所以也没继续深入弄下去. 因为VS还有另外一个项目可以实现真机调试安卓的C++代码, 这个就留到下一次的文章来讲.
后话
最后再补充三个cmake的参数, 有些可能是需要的.
-DANDROID_ABI=arm64-v8a -DANDROID_NATIVE_API_LEVEL=23 -DANDROID_TOOLCHAIN=clang
其中第一个-DANDROID_ABI=arm64-v8a这个很重要, 生成64位arm64-v8a还是32位armeabi-v7a的程序就靠这个宏.
第二个-DANDROID_NATIVE_API_LEVEL=23这个我目前还未发现有用的地方
第三个 -DANDROID_TOOLCHAIN=clang这个应该可以不要, 原来可以在gcc和clang中选择, 现在应该都使用clang了.
如果是32位应用的话就把上面的-DANDROID_ABI=arm64-v8a改为-DANDROID_ABI=armeabi-v7a. 改完后记得保存并更新CmakeCache.
还有CmakeBuildType可以在这里选择:
通过这两种的组合你应该可以新增Android-v7a-Release等等配置.
真是要命, 11点50突然想起写这篇文章, 写完就到一点了. 早点休息吧, 明天还要去练习场, 练练我的一号木.
关闭VS项目的时候, 突然又想起来还有一个事情.
上面还没有用到Make.exe. 上面的生成器是Ninja.
其实用这个也没啥问题, 现在很多都用这个作为生成器. 但是既然一开始介绍了make, 最后再示范下怎么用makefile作为生成器.
1. 在配置文件中, 展开高级设置:
2. 选中Unix Makefiles:
3. 修改以后, 保存并更新CMake Cache. 再次运行全部生成:
现在这个目录下才是makefile的文件.
你也可以在当前路径下,直接运行make进程生成:
这里和Linux下一样, 修改cpp文件后直接运行make就行了,它会自动编译修改的cpp文件重新链接到程序.
至于是使用控制台的make命令还是,在VS下运行全部生成就看你个人喜好了.