android NDK開發、編譯、調試環境搭建與操作入門

前話 

      現在越來越多的應用開發、場景會用到NDK,NDK的開發環境和工具也可謂是“日新月異”,Googleg還是比較給力,時至今日ADT已經發布了21.0.1,實際上從20.0.3已經對我們需要使用的NDK有了比較好的支持了,使用Eclipse可以直接斷點NDK代碼。

 

       以前似乎我們只能通過打日誌或者在其它工具如VS、Xcode下寫測試工程來調試,以及使用神話般的GDB來調試,搭建調試環境算是程序調試過程中一點點雕蟲小技吧。不廢話,直入主題。

 

一、 首先工具準備

       Eclipse ADT插件,版本要求20.0.3以上;NDK,現在最新版本是r8d。Android官網上提供了eclipse、SDK、ADT打包下載,而Android開發不是必須的NDK需要單獨下載。不過還是很多人不喜歡打包形式的,對自己喜歡的eclipse版本非常鍾情之類。我們按非打包的形式下載的情況來搭建NDK環境:下載好之後,解壓eclipse,安裝ADT插件,以前我們用eclipse開發C/C++需要安裝CDT插件,現在ADT插件已經包含了CDT,安裝完ADT,需要設置下SDK目錄,然後通過SDK Manager更新下SDK,然後還需要設置NDK目錄。當然還有cygwin,官方下載默認安裝選項就OK,設置好PATH就不用管了!

 

二、 幾項簡單設置

SDK目錄配置:

       Eclipse文件菜單選擇“Window”--->“Preferences”--->“Android”--->設置“SDK Location”--->”Browse”選擇SDK目錄即可。 如下圖:



 

到此,普通Android開發環境已經OK,如果需要開發NDK,那麼繼續。 NDK目錄配置: 設置完SDK後還需在“Android”配置項上設置下“NDK”,選擇NDK後,有一個選項“NDK Location”,這裏配置NDK根目錄。

如下圖:

 

 
 

       接下來選擇在你要開發NDK的Android項目上右鍵,選擇“Android Tools”再添加Native的支持。



 

       如果不需要調試,這時編譯環境已經OK了; 另外:如果需要兼容老的項目,那麼老項目的路徑得規劃好了,新項目我個人覺得把源碼都通過eclipse來添加和編輯也未嘗不可。這裏就不細說這些具體的開發細節了,只探討環境問題。 除了能開發、編譯NDK之外,如果需要調試NDK,那麼繼續:

修改編譯命令,在C++ Build中設置Build command,把Use default選項去掉,在ndk-build後面添加參數NDK_DEBUG=1,使得編譯出的SO帶源碼等調試信息。 如下圖:



 

開發、編譯、調試環境到這裏算是OK了。調試具體的操作繼續看下面。

 

三、 操作方法

編譯後如果查看源代碼:

    Eclipse編譯後,我們可以在C/C++視圖中的Project窗口看到一個Binaries條目,裏面有我們的so,調試環境中編譯出來的so和非調試環境編譯出來的so不一樣,點它左邊的個小三解,就可以看到源碼了,這對於很多不是在此項目中開發的源碼,這個查看方法非常有效。另外我們也可以在Debug視圖中打開Executables的窗口,這裏除了可以看到你自己項目的so,還可以添加外面編譯好的帶調試信息的so,然後在右邊就也可以看到源碼了。

具體見如下兩個截圖:



 

Executables窗口



 

最最最基本的操作——打斷點

       打開源碼後,打斷點就跟平常一樣的了,不過有時候可能會雙擊打斷點,點半天也點不上,不急,這種情況下,你可以先啓動Native Debug,

讓eclipse先領會下你的意思,具體操作如下截圖:

啓動Native Debug



 
 

添加斷點,跟平常Java斷點沒有太多區別:



 

斷點進來後的效果:

 

跑起來之後,執行操作就等着進到斷點這裏來吧,效果如下,看圖就什麼都瞭解,變量、調用堆棧、反彙編、內存監控,基本上已經夠我們用了,當然這比起原生的GDB,還是有些差異的,不能使用break commands,不能打補丁,不過我們也可以知足了。到這裏你可以開始你的捉蟲、抓鬼活動了。

 

 

四、 可能遇到的問題以及解決辦法

       筆者在使用這個環境中還遇到了一些問題,也分享下,如果遇到同樣的問題,大家也可以少走彎路了,再看下面吧。

1、 Eclipse可能報一堆的錯誤提示 由於eclipse的語法檢查,當你打開一個源碼,尤其是引入外面開發完成的項目,因爲源碼不是在工程中管理的,大部分情況會報一堆的錯誤提示,而你是明確這些問題實際上是不存在的,那麼就可以這樣子做了,設置項目屬性,把eclipse多管的這些閒事給免了它的職,如下圖,保存後,你會發現你的problems窗口下非常清爽了:

 

 

2、 NDK編譯時報錯 NDK編譯時很多時候可能還會有各種各樣的錯誤,我的解決辦法就是google,我們遇到過的問題,一定別人早就遇到過了,一般就是在mk中加入一些參數即可,比如下面我就遇到過的一個問題 Android NDK: WARNING: APP_PLATFORM android-X is larger than android:minSdkVersion x in ./AndroidManifest.xm……

這個問題的解決辦法在 Application.mk中添加一個參數APP_PLATFORM :=android-<minSdkVersion>就萬事大吉了。

 

3、 NDK調試目標庫(so)時,編譯過程會清除libs目錄所有的so 解決辦法,○1把其它的so拷出libs目錄,採用指定路徑方式來加載so, ○2把其它so拷到另外一個目錄,然後在mk文件中添加一個編譯target,對這些so 進行一次拷貝,當默的“all”執行完之後再執行這個target,對其它so進行一次拷貝,當然也可以使用Ant添加一個編譯腳本來做你想要做的事情。 在Android.mk中添加一個make的target,因爲我Windows下裝了cygwin所以用了cp來拷貝,Windows下相應的改成copy吧



 

然後在增量編譯命令中加入這些target,如下圖



 

4、 編譯慢 這個問題真的是程序員必定會遇到的問題,不過在這裏如是你是跟我一樣是在Windows下進行NDK開發,蛋痛的很,編譯時間你完全可以去喝杯咖啡。一個小改進,我們在配置編譯命令的時候,加一個參數“-j4”,開啓多線程去編,不過這時候你就真的只有去喝咖啡了,電腦CPU已經滿了,還有一個解決辦法,如果你面子大的話,找BOSS申請好機器、加內存換SSD去。

 

5、 一些不需要打斷點這麼麻煩的問題 很多情況下我們都只是打了日誌就夠了,NDK也提供了一些工具像ndk-stack, addr2line之類的可以幫助我們來分析日誌、出錯代碼行等。

 

6、NDK調試,經常會碰錯誤:

Java代碼  收藏代碼
  1. No symbol table is loaded.  Use the "file" command.  

 

使用ndk-gdb --start 啓動程序第一個activity,但是此時so文件並沒有被加載。解決方法:首先打開程序並使用,在保證so文件已經被使用的情況下,調用ndk-gdb命令調試程序進程。正確流程:1.創建一個模擬器或者使用真機運行想要調試的程序,確保so文件已經被加載。
一個比較簡單的方法,在load so庫的java文件中添加一個無關緊要的方法,比如:
Java代碼  收藏代碼
  1. public static void test1(){  
  2.     Log.i(tag, "test1");  
  3. }  
 然後在主activity起來的時候,調用一下這個方法就OK了。

 

我所遇到的這些問題還是比較少,肯定還有更多更有趣更難搞的問題,歡迎大家找筆者一起交流遇到的問題。


原文地址:http://qiang106.iteye.com/blog/1830416

謝謝原作者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章