VS2019 C++安卓控制檯程式開發

2020-08-13 01:11:35

前言

之前有介紹過在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的預定義裏面:

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下執行全部生成就看你個人喜好了.