如何在Eclipse CDT/CMake上編程Android C/C++ 原生程式 (適用Android P以上)

前言

對Android App的應用開發者而言,用C/C++開發,就使用Android Studio已提供C/C++/JNI的編程功能就足夠了。但是對於Android Studio所提供的C/C++編程功能並無法完全滿足Android平台開發人員在進行以C/C++編寫的平台原生服務(Native Service)。所以原生服務例如:netd、surfaceflinger或甚至init。

本文是說明如果利用Eclipse匯入Android的原生代碼(Native C/C++ Code),並且直接在Eclipse可以瀏灠、修改及編譯C/C++原生代碼以提升Android平台工程式的效率。
由於Android平台工程師主要的工作環境是Ubuntu,所以我們選擇的套件為:
期望可以得到的功能是:

  • 在Eclipse成功編譯可在Android上執行的程式
  • 可載入Android原生Project,並且在Eclipse進行編寫、索引、編譯甚至除錯的完整功能





為何選擇Eclipse

Eclipse應該不用做太多介紹。它算是目前在跨平台、免費的IDE中最受歡迎之一的軟體。從Eclipse一開始,就以核心服務+插件的基礎架構上,Eclipse吸引了大批的開發人員在Eclipse平台上進行各式插件開發。十幾年發展下來,Eclipse幾乎跨越了所有編程上的語言,只是成熟度上有所不同(這也直接導致當時IDE的軟體商幾乎賺不到錢了,紛紛消失或賣掉了,且讓我們懷念一下Borland!而很多當時開源的IDE,也逐漸退出,直到VSCode的出現,才又有了一個開源又好用的IDE!)。Eclipse編程工具中,最成熟的是Java,且C/C++的成熟度也是很高。

之所以選擇Eclipse做為開發Android原生服務C/C++的原因,主要還是經過一些比較後決定:

  • Eclipse CDT (C/C++ Development Tool)經長期開發,比起其他工具,相對穩定好用,功能齊全
  • Eclipse CMake支援,讓撰寫跨平台編譯文本(類似Makefile)變得容易上手。
  • Eclipse CMake支援Indexer,可進行靜態語法分析,精確度遠勝Source Insight。而且CDT Indexer支援C++14/17的語法,像是lambda語法。

安裝Eclipse CDT/Cmake及第一個“Hello World!" C++專案


安裝Eclipse 2016-06(Ubuntu Desktop 18.04 64bit)

本文發佈時(2019/6/30)最新的Eclipse穩定版本為2019-06版,那就選擇它吧!
請先確認JDK 8已安裝,因為Eclipse是
到 https://www.eclipse.org/downloads/

Eclipse 2019-06版下載頁面

點擊「Download 64 bit」進入下載連結
從最近的mirror site下載Eclipse Installer

再點擊「Download」,開始進行下載。

下載完成後,解壓縮後,在該目錄下,可以看到eclipse-inst,如圖所示:
解壓縮後目錄內容
雙擊eclipse-inst,執行安裝程式。跳出Eclipse安裝程式:

Eclipse for C/C++ Developers

點擊「Eclipse IDE for C/C++ Developers」後,再按下「Install」並接受License/Certifictions之後,就開始下載並安裝。安裝完成後,點擊「Launch」,則開啟Eclipse。


安裝Eclipse CMake 

安裝Eclipse CMake Plugin,讓CDT可以使用CMakeList.txt作為Build Script。
在Eclipse中,點擊 [Help->Eclipse Marketplace...]



跳出Eclipse Market視窗後,在Find:文字欄中輸入CMake,並且按下右方的「GO」按鈕。
顯示出CMake相關的插件我們需要:

  • cmake4eclipse 1.14.0
  • CMake Editor 1.11.0

分別安裝(按下各插件右下方的Install),安裝這兩個插件。接受License,開始安裝作業。
安裝完成後重新啟動Eclipse。

事實上CDT也開始自己的CMake Plug-in的支援,目前仍在Preview版本。基本上在使用Linux上標準GCC時支援度不錯,但在Cross Compile時的CDT Index判斷就出現問題。所以目前仍選擇使用cmake4eclipse。

第一個CMake Project

在Eclipse中,點擊 [File->New->C/C++ Project]
開啟CDT C/C++ Project
開啟Projects視窗後,選擇CMake Project


之後輸入Project Name,例如「helloworld」,然後按下「Finish」。則成功建立一個CMake Project。
按下Eclipse左上角工具列的第一個按鈕,則開始進行Project Build,結果如下圖:


可以看到左上角的槌子圖示就是Build,再右邊圖示是執行,最後再右邊圖示是停止執行。
Build成功後即可執行。如果發生錯誤有可能是沒安裝cmake或ninja命令套件。

sudo apt install cmake
sudo apt install ninja-build

執行後應該就能在Console View (底部的視窗,有個Console,除了顯示Build的過程,也會顯示執行結果)。

Eclipse和Android AOSP整合

接下來就是重頭戲了。如果只是單純推廣Eclipse CDT/CMake倒是沒什麼Know-How(雖然網路上好像沒找不到這方面的文章),那這文章也不必特別寫了。我們的目的主要還是要讓Eclipse成為開發Android平台的好工具。在使用Eclipse修改Android原生C/C++之前,我們還是先滙入一個全新簡單的C/C++專案來做為入門課程,比較容易上手。

我已經完成一個簡單的GitHub專案,可用來做初步的教程。

Hello World! 在Android上執行

先關閉Eclipse。因為在進入Eclipse之前要先把Android Build System的環境變數設定完成,這些環境變數在之後我們用的CMakeLists.txt會用到。之所以要使用到Android Build System的環境變數,主要是確保我們的CMakeLists.txt的相容性和可移植性。

首先進入你的Android Codebase,並且確認你已完成環境設定,而且必須確認整個Codebase已經Build過了,以AOSP Pixel2為例:
sh. ./build/envsetup.sh 
lunch aosp_walleye-userdebug
make -j16

確保我們的環境變數都設定完成,接下來開啟Eclipse。重新開啟一次是確認Eclipse都取得AOSP的環境變數,以利於我們之後取得Android的C/C++ Compiler路徑。

此時取得在GitHub中的第一個Sample。這個Sample已存在GitHub,我們可以直接用Eclipse取出來。

滙入Sample Project: helloworld !

在Eclipse下選擇「File-->Import」

用Eclipse滙入GitHub中的

選擇「Projects from Git」,按下「Next>」

選擇「Clone URI」,按下「Next>」



在URI中輸入「https://github.com/c55jeremy/android-cmake」,其他欄位會自動填好,按下「Next>」,之後一直「Next>」到「Finish」則完成滙入。如下圖:


按下「Finish」完成滙入。
按下來就是按下左上角的Build Icon(鎚子圖示)


完成編輯後,在android-cmake刷新(F5),會看到CMake產生出來兩個Targets:hellworld及libmyfunc.so。把它們推入手機中即可執行。

執行helloworld

Eclipse預設滙入Git Project存放在~/git(除非剛剛的匯入過程中,你有更動)。
所以android-cmake這個Project Build出來的Targets (helloworld及libmyfunc.so)就放在~/git/android-cmake/build/Debug下。
開啟Terminal,用adb將這兩個檔案推入:

adb root
restarting adbd as root
adb remount
remount succeeded
adb push helloworld /system/bin
helloworld: 1 file pushed. 2.4 MB/s (92368 bytes in 0.037s)
adb push libmyfunc.so /system/lib64
libmyfunc.so: 1 file pushed. 4.1 MB/s (71832 bytes in 0.017s)
adb shell helloworld 
16 2 77 29 
Hello Android! Hello! myfunc
999

最後產生的Output (10~12行),就是我們在android-cmake的main.cpp/myfunc.c的程式碼輸出結果。這可以證明我們在外部產生一個可執行檔,並且使它連結動態函式庫,完成結果。

之後如果仍需要開發其他的Android Native Program,就直接Copy/Paste這個Project以建立新的Project並進行修改即可。

待續...

之後會在補上:
1. CMakeLists.txt的解釋。
2. 如果不使用滙入,如何逐步建立自己的Eclipse/CMake Project。

結論

Eclipse/CMake目前在完整度上完全可以符合Android平台工程師在看Native Code的需求,但目前仍未把Android的原生碼滙入,所以之後我會再解釋如何把Android原生服務的Project匯入,以整合成一個完整的Android平台開發環境。




留言

  1. android studio eclipse debug c++ on ndk-v20b
    http://fatalfeel.blogspot.com/2013/10/android-studio-with-eclipse-debug-jni.html

    回覆刪除

張貼留言

這個網誌中的熱門文章

完整指引如何編譯AOSP (Build Android P),整合GMS及刷機 (Pixel 2)

架設Gerrit Server : 架設本地AOSP Gerrit Server完整指引 PART1

將AOSP加入Gerrit Server : 架設本地AOSP Gerrit Server完整指引 PART2