如何在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,所以我們選擇的套件為:
- Ubuntu 18.04 Desktop (應可適用Ubuntu 14.04以上版本)
- CMake 3.x 以上版本(Ubuntu 14.04預設版本為v2.6,必須升級至3.x,可參考:https://www.claudiokuenzler.com/blog/755/install-upgrade-cmake-3.10.1-ubuntu-14.04-trusty-alternatives)
- Java 8
- Eclipse 2019-06 with CDT/CMake Plug-ins
- cmake/ninja
- 在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 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 |
之後輸入Project Name,例如「helloworld」,然後按下「Finish」。則成功建立一個CMake Project。
按下Eclipse左上角工具列的第一個按鈕,則開始進行Project Build,結果如下圖:
可以看到左上角的槌子圖示就是Build,再右邊圖示是執行,最後再右邊圖示是停止執行。
Build成功後即可執行。如果發生錯誤有可能是沒安裝cmake或ninja命令套件。
執行後應該就能在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為例:
確保我們的環境變數都設定完成,接下來開啟Eclipse。重新開啟一次是確認Eclipse都取得AOSP的環境變數,以利於我們之後取得Android的C/C++ Compiler路徑。
此時取得在GitHub中的第一個Sample。這個Sample已存在GitHub,我們可以直接用Eclipse取出來。
滙入Sample Project: helloworld !
在Eclipse下選擇「File-->Import」![]() |
用Eclipse滙入GitHub中的 |
選擇「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將這兩個檔案推入:
最後產生的Output (10~12行),就是我們在android-cmake的main.cpp/myfunc.c的程式碼輸出結果。這可以證明我們在外部產生一個可執行檔,並且使它連結動態函式庫,完成結果。
之後如果仍需要開發其他的Android Native Program,就直接Copy/Paste這個Project以建立新的Project並進行修改即可。
待續...
之後會在補上:1. CMakeLists.txt的解釋。
2. 如果不使用滙入,如何逐步建立自己的Eclipse/CMake Project。
android studio eclipse debug c++ on ndk-v20b
回覆刪除http://fatalfeel.blogspot.com/2013/10/android-studio-with-eclipse-debug-jni.html