Eclipse+CDT+GDB調試Android NDK程序

轉載自:http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html

先介紹一下開發環境,在這個環境下,up主保證是沒有問題的。

  1. ubuntu 11.10
  2. eclipse 3.7(indego) for java
  3. jdk 6
  4. android sdk 2.2
  5. andrid ndk r7

 

當然,在windows環境下通過cygwin等工具也是可以實現gdb調試的,我也確實實現過。但是性能實在太低,卡的根本沒法用。Linux下直接用gdb調試本地方法是很流暢的。

再確定安裝並配置好開發環境之後,就可以開始了。

首先得確定自己能夠正常的運行一個ndk工程,連運行都成問題的話,也就談不上什麼調試了。

 

新建一個android項目,選擇crete project form existing source,源代碼位於

/home/shaodx/android/android-ndk-r7/samples/hello-jni,即ndk目錄的samples/hello-jni。

 

Next>

Sdk target 就選2.2吧 ,其他的雖然沒測試,應該也沒什麼問題。

 

Finsh

 

Hellojni項目極其簡單,看代碼就懂了。在activitie下建立一個textview,然後調用一個natvie方法來返回一個字符串,然後把textview的text設置爲這個字符串。

爲了方便看到調試後的效果和局部變量的變化情況,我加了幾行對程序結果沒影響的代碼。

Java代碼:

C++:

當然,這個時候直接運行的話,程序肯定會崩潰的。因爲動態鏈接庫還沒編譯好。Ndk根目錄下的ndk-build負責編譯so文件。首先進入項目所在目錄,然後運行ndk-build即可。

效果如下:

出錯了…..

Host 'awk' tool is outdated.

上網搜索之後的解決方案如下:

到/home/shaodx/android/android-ndk-r7/prebuilt/linux-x86/bin/目錄下找到這個awk,file一下:

這個awk文件居然是64位版的,難怪之前說過期了。(google程序員粗心了吧)

解決方案居然是把這個awk刪了就行了……………..

解決問題之後,換個姿勢,再來一次

 

So文件存在於libs/armeabi/libhello-jni.so。

現在就可以運行程序了。

不過要是每一次修改c++代碼都還要調用ndk-build的話,那也太麻煩了。介紹一個一勞永逸的方法。

首先,要給eclipse安裝一個CDT,eclipse>help>install new software

下載地址爲   http://download.eclipse.org/tools/cdt/releases/indigo/

反正我是把所有的選項都給安裝了,也花不了太多的時間。

然後是安裝sequoyah  地址爲 http://download.eclipse.org/sequoyah/updates/2.0/

這個就只需要安裝Sequoyah Android Native Code Support 一項就可以了。

然後把當前項目轉換爲C++項目。

File>new>other:

 

Convert to a c/c++ Project

依照圖中所示設置:

Finish。

這個時候,項目中的c++代碼也會被識別了。一般這個時候就會爆出一堆錯誤,主要是gcc找不到jni.h頭文件,同樣也識別不了來自jni的一些函數和數據類型:

 

於是就要給gcc添加一個環境變量讓它來找到jni.h了,環境變量名稱爲C_INCLUDE_PATH。這個名字不能亂寫,windows下類似的環境變量叫做INCLUDE。

然後多刷新幾次工程,這些錯誤就消失了。

接下來,進行C++代碼的編譯配置。

進入工程屬性頁,build command設置爲ndk下ndk-build的完整路徑。

 

將Behavior選項頁下的build處的all替換爲空格

 

接下來就可以直接運行了,每次運行的時候,就會自動把C++代碼編譯成so文件。同時,可以在eclipse中編寫java代碼和C++代碼,很是方便。

 

 

 

往下的工作就真的跟調試相關了。

首先進入工程目錄,然後運行ndk目錄下的ndk-gdb。執行這一步驟時,應當先確保有模擬器在運行。如果有人更習慣於命令式的方法來調試程序的話,就可以直接用這個ndk-gdb來調試程序了。接下來的步驟就是把這個gdb調試圖形化。

 

在eclipse下進入debug>debug configuration,選擇C/C++ Application,main選項卡下的C/C++ Application處填寫爲/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi/app_process,這個文件是專爲調試而存在的,假如發現找不到這個文件的話,就應當先運行一次ndk-gdb。只運行ndk-build是不會產生這個文件的。Project選擇當前的HelloJni。

最下面的 process launcher  select other 選擇stuanard

然後進入Debugger選項卡,Stop on startup at 填寫的是C++程序的入口函數,這個項目中就是Java_com_example_hellojni_HelloJni_stringFromJNI了,我覺得這個參數應該沒什麼用的,記得設置斷點就行了。Gdb debugger 爲:home/shaodx/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb,這個路徑下有很多文件針對其他平臺的,別選錯了。Gdb command file爲/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi/gdb2.setup,目前這個gdb2.setup文件還不存在,待會在創建。底下的Verbose console mode 一定要記得勾上,這樣才能在eclipse控制檯中用指令來與gdb交互。

 

 

進入debugger options的 connection子項,type爲tcp,端口爲5039:

 

設置完畢之後,apply。

接下來只需要修改兩個文件即可。修改之前記得備份

首先是ndk-gdb,把最底下的一行 “$GDBCLIENT -x `native_path $GDBSETUP`”直接去掉,保存。

 

然後把'/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi'目錄下的gdb.setup複製一份,命名爲gdb2.setup。把gdb2.setup打開,去掉最後一行的“target remote :5039”,千萬不要在以爲把gdb.setup修改好,然後把之前的設置指向gdb.setup會起作用,因爲每次調用ndk-gdb的時候,都會產生一個新的gdb.setup 來覆蓋掉修改。

 

然後就可以給代碼設置斷點了,首先在調用本地方法之前記得有一個斷點,之後也設置一個。

 

C++的代碼在函數入口處設置一個斷點即可。

下面開始正式的調試了,先運行項目的java調試。程序會再運行到第一個斷點處停下來。

這個時候趕緊運行在命令行下進入工程目錄,然後運行ndk根目錄下的ndk-gdb。

運行之後是沒有任何輸出的。

 

然後啓動C++的debug,即之前配置好的那個jni debug。

如圖:

 

由於在C++程序之也設置了斷點,繼續摁F6就可以直接執行到C++程序中。

來個大圖,熟悉eclipse的調試就沒什麼壓力了。右上角可以直接看到局部變量的值,包括傳進來的參數。

 

同時,可以在控制檯直接與gdb通訊,要退出C++程序的調試的話,continue即可,程序又回到java代碼:

 

 

發佈了154 篇原創文章 · 獲贊 9 · 訪問量 108萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章