天天看點

Eclipse+CDT+GDB調試android NDK程式

原文位址為: Eclipse+CDT+GDB調試android NDK程式

Eclipse+CDT+gdb調試android ndk程式

先介紹一下開發環境,在這個環境下,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。

Eclipse+CDT+GDB調試android NDK程式

Next>

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

Eclipse+CDT+GDB調試android NDK程式

Finsh

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

為了友善看到調試後的效果和局部變量的變化情況,我加了幾行對程式結果沒影響的代碼。

Java代碼:

Eclipse+CDT+GDB調試android NDK程式

C++:

Eclipse+CDT+GDB調試android NDK程式

當然,這個時候直接運作的話,程式肯定會崩潰的。因為動态連結庫還沒編譯好。Ndk根目錄下的ndk-build負責編譯so檔案。首先進入項目所在目錄,然後運作ndk-build即可。

效果如下:

Eclipse+CDT+GDB調試android NDK程式

出錯了…..

Host 'awk' tool is outdated.

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

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

Eclipse+CDT+GDB調試android NDK程式

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

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

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

Eclipse+CDT+GDB調試android NDK程式

So檔案存在于libs/armeabi/libhello-jni.so。

現在就可以運作程式了。

Eclipse+CDT+GDB調試android NDK程式

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

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

下載下傳位址為   http://download.eclipse.org/tools/cdt/releases/indigo/

Eclipse+CDT+GDB調試android NDK程式

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

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

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

Eclipse+CDT+GDB調試android NDK程式

然後把目前項目轉換為C++項目。

File>new>other:

Eclipse+CDT+GDB調試android NDK程式

Convert to a c/c++ Project

依照圖中所示設定:

Eclipse+CDT+GDB調試android NDK程式

Finish。

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

Eclipse+CDT+GDB調試android NDK程式

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

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

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

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

Eclipse+CDT+GDB調試android NDK程式

将Behavior選項頁下的build處的all替換為空格

Eclipse+CDT+GDB調試android NDK程式

接下來就可以直接運作了,每次運作的時候,就會自動把C++代碼編譯成so檔案。同時,可以在eclipse中編寫java代碼和C++代碼,很是友善。

Eclipse+CDT+GDB調試android NDK程式

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

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

Eclipse+CDT+GDB調試android NDK程式

在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。

Eclipse+CDT+GDB調試android NDK程式

最下面的 process launcher  select other 選擇stuanard

Eclipse+CDT+GDB調試android NDK程式

然後進入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互動。

Eclipse+CDT+GDB調試android NDK程式

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

Eclipse+CDT+GDB調試android NDK程式

設定完畢之後,apply。

接下來隻需要修改兩個檔案即可。修改之前記得備份

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

Eclipse+CDT+GDB調試android NDK程式

然後把'/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 來覆寫掉修改。

Eclipse+CDT+GDB調試android NDK程式

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

Eclipse+CDT+GDB調試android NDK程式

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

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

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

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

Eclipse+CDT+GDB調試android NDK程式

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

如圖:

Eclipse+CDT+GDB調試android NDK程式

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

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

Eclipse+CDT+GDB調試android NDK程式

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

Eclipse+CDT+GDB調試android NDK程式

完畢。

轉載請注明本文位址: Eclipse+CDT+GDB調試android NDK程式

繼續閱讀