Ubuntu 下用 Eclipse 編譯調試 Android NDK 工程

一、開發環境搭建:
1.首先,要給 Eclipse 安裝 CDT :
  選擇菜單 [Help] -> [Install newsoftware...],
  彈出 "Install" 窗口,
  點擊 Add 按鈕,彈出 "Add Repository" 窗口,
  在 Name: 文本框中輸入 CDT ,
  在 Location: 文本框中輸入http://download.eclipse.org/tools/cdt/releases/juno
  點擊 OK 按鈕保存,
 
  選擇 Work with: 下列拉表框中的:
  CDT -http://download.eclipse.org/tools/cdt/releases/juno
 
  將 CDT Main Features 和 CDT Optional Features兩項全選中,
  點擊 Next> 按鈕,按提示點擊安裝即可!
 
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

2.然後,要給 Eclipse 安裝 Sequoyah :
  選擇菜單 [Help] -> [Install newsoftware...],
  彈出 "Install" 窗口,
  點擊 Add 按鈕,彈出 "Add Repository" 窗口,
  在 Name: 文本框中輸入 Sequoyah ,
  在 Location: 文本框中輸入http://download.eclipse.org/sequoyah/updates/2.0
  注:在 http://www.eclipse.org/sequoyah/downloads/這裏可以得到最新版的地址。
  點擊 OK 按鈕保存,
 
  選擇 Work with: 下列拉表框中的:
  sequoyah-2.0 -http://download.eclipse.org/sequoyah/updates/2.0
 
  注意:一定要將 "Group items by category"複選框的對勾去掉,
     不然會顯示爲 "There are no categorized items"!!!
 
  將 [Sequoyah Android 本地化編輯器] 和 [Sequoyah Android本機代碼支持] 兩項全選中,
  點擊 Next> 按鈕,按提示點擊安裝即可!

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程
 
3.最後,要設置本機開發 NDK 位置:
  選擇菜單 [Window] ->[Preferences],
  彈出 "Preferences" 窗口,
  在左側窗欄中選擇 Android -> 本機開發選項,
  在右側窗欄中點擊 Browse... 按鈕,選擇 NDK 解壓後的目錄,
  點擊右下角的 Apply 按鈕保存設置。

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

4.把 NDK 目錄下的 ndk-gdb 腳本的最後一句註釋掉!
  #$GDBCLIENT -x `native_path $GDBSETUP`

5.將 android-ndk-r8b 和 android-sdks/platform-tools 的全路徑添加到 PATH環境變量中:
  $ sudo gedit /etc/environment
  注:添加完之後用 $ . /etc/environment 重新加載一下新的 PATH變量值。
    因爲 ndk-build、ndk-gdb、adb 等腳本或工具要被調用時需要。

二、開發環境使用:
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

1.新建或導入一個 Android 工程 TestJniPro,修改 java 代碼,引用了一個本地庫函數,例如:
  @Override
  public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_orange);
     new AlertDialog.Builder( this ).setMessage( sayHello()).show();
  }

  public native String sayHello(); // 本地庫函數
  static
  {  
     System.loadLibrary( "NativeCode" );  
  }
 
2.在 工程名 上點擊 右鍵 選擇菜單 [Android Tools] -> [Add NativeSupport...],
  彈出 "添加 Android 本機支持" 窗口,
  確認一下 NDK 位置是否正確,
  修改一下 將添加庫名稱 lib*.so下的文本框中的庫名(不含lib和.so)爲你想要起的名字(如:NativeCode),
  點擊 finish 按鈕後,
  工程目錄中應該多了一個 jni 目錄,目錄中有兩個文件 庫名.cpp 和 Android.mk。
  (例如:NativeCode.cpp)
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程
 
3.在 終端 裏進入 jni 目錄下,然後執行如下命令創建 jni 樣式的頭文件:
  $ javah -classpath ../bin/classeswzh.nsc.TestJniProActivity
  注:TestJniProActivity 類中定義引用了本地庫函數,所以要用它來創建 jni樣式的頭文件。

4.在 NativeCode.cpp 文件中添加代碼:
  #include "wzh_nsc_OrangeActivity.h"
 
  JNIEXPORT jstring JNICALL
  Java_wzh_nsc_orange_OrangeActivity_sayHello(JNIEnv* env,
                                    jobject this)
  {
     return env->NewStringUTF( "Hello, I'm an Demo!");
  }

5.編譯工程,如果出現如下錯誤:
  Method 'NewStringUTF' could not beresolved  源代文件名.c /TestJNIC/jni  line 6  SemanticError  
  Type 'JNIEnv' could not beresolved         源代文件名.c  /TestJNIC/jni  line4  Semantic Error  
  Type 'jobject' could not beresolved        源代文件名.c  /TestJNIC/jni  line4  Semantic Error  
  Type 'jstring' could not beresolved        源代文件名.c  /TestJNIC/jni
 
  解決辦法:
  右鍵點擊 工程名 ,選擇菜單 [Properties],
  彈出 "Properties for 工程名" 窗口,
  在窗口左窗欄中選擇 C/C++ General -> Pathsand Symbols ,
  在窗口右窗欄中選擇 Includes 選項頁,
  在 Language 欄中的
  GNU C 和 GNU C++ 添加絕對路徑/android-ndk-r8b/platforms/android-8/arch-arm/usr/include

6.創建 Android 虛擬機,並運行它。


7.右鍵點擊 工程名 ,選擇菜單 [Run As]-> [1 Android Application],
 來運行測試上面的程序是否可以正常運行。
  注:如果在 Problems選項頁中出現類似如下錯誤:
  make: *** No rule tomake target `工程名_scd.mk'.  Stop. 工程名 [Discovery Options] page in projectproperties  C/C++ Problem
 
  解決辦法:
  右鍵點擊 工程名 ,選擇菜單[Properties],
  彈出 "Properties for 工程名"窗口,
  在窗口左窗欄中選擇 C/C++ Build,
  在窗口右窗欄中選擇 BuilderSettings 選項頁,
  去掉 Use default buildcommand 複選框的對勾,
  修改 Build command:後面文本框中 ndk-build 爲全路徑!
  在窗口右窗欄中選擇 Behaviour選項頁,
  修改 Build(Incrementalbuild) 後面文本框將 V = 1 去掉,使之成爲空文本框!

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

 注:如果此問題在聯機調試依然存在,直接在它上面點擊右鍵選刪除即可!

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

8.修改工程配置文件 AndroidManifest.xml ,將 Debuggable 標誌設置爲 true。
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

9.在 終端 中進入 工程目錄 ,執行 ndk-gdb 命令,
  將在 obj/local/armeabi 中生成了app_process(可執行程序)、gdb.setup(配置文件) 等新文件。
  注:執行這一步驟時,應當先確保程序是在模擬器中運行着。
 
  右鍵點擊 工程名 ,選擇菜單 [Debug As] 或 主菜單 [Run]-> [Debug Configurations...],
  彈出 "Debug Configurations" 窗口,
  在窗口左窗欄中 雙擊 C/C++ Application ,其下才會出現 工程名 Default選項,點擊選擇它,
  在窗口右窗欄中選擇 Main 選項頁,
  點擊 Browse... 按鈕,
 
  修改 C/C++ Application: 下面的文本框內容爲工程目錄下/obj/local/armeabi/app_process
  注:這個文件是專爲調試而存在的,假如發現找不到這個文件的話,就應當先在工程目錄下運行一次ndk-gdb 。
 
  Project: 下面的文本框選擇當前工程,一般不用修改,默認就是當前工程。
 
  修改Build(if required)before launching 組下的
  Selectconfiguration using 'C/C++ Application' 複選框打上勾;
  Disableauto build 單選框被選中;

Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程
  
  點擊當前窗口正下方的 Using GDB(DSF) CreateProcess Launcher - Select other...
  彈出 "Select PreferredLauncher" 窗口,
  將 Use configurationspecific settings Change Workspace Settings... 複選框勾選,
  選中 Launchers: 列表框中的Standard Create Process Launcher
 
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程

  在窗口右窗欄中選擇 Debugger 選項頁,
  修改 Debugger: 下拉列表框選項爲 gdbserver
 去掉 Stop on startup at:main 之前的對勾,即不勾選此複選框
  修改 Debugger Options 組下的 Main 選項頁中的 GDB debugger:後的文本框值爲:

 絕對目錄/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb
 注:這個路徑下有很多文件針對其他平臺的,別選錯了。
 
  修改 Debugger Options 組下的Main 選項頁中的 GDB command file: 後的文本框值爲:
 工程目錄下/obj/local/armeabi/gdb2.setup
  注:把工程目錄下/obj/local/armeabi/gdb.setup 複製一份,命名爲 gdb2.setup,
    把 gdb2.setup 最後一行的target remote :5039 去掉。
    
    不設置指向 gdb.setup的原因是:
    因爲每次調用 ndk-gdb的時候,都會產生一個新的 gdb.setup 來覆蓋掉修改過的 gdb.setup 。
 
  在 Debugger Options 組下的Main 選項頁中的
  Verbose console mode 和Use full file path to set breakpoints 兩個複選框要勾上,
  注:只有 Verbose consolemode 記得勾上,才能在 Eclipse 控制檯中用指令來與 gdb 交互。
 
  在 Debugger Options 組下的Connection 選項頁中
  修改 Type: 下拉列表框的值爲TCP
  修改 Host name or IPaddress: 文本框的值爲 localhost
  修改 Port number: 文本框的值爲5039 
  (注:因爲 gdb.setup 的最後一行target remote :5039 所以 Port number 設此值。)
 
  點擊當前窗口右下角的 Apply按鈕保存應用。

 注:一定要點擊 Debug 按鈕,不然下圖中的 TestJniPro_Default就不會出現在菜單中!
 
10.現在就可以給代碼設置斷點了,一定要在調用 本地庫函數 之前和之後各設置一個斷點!
   注:因爲要給運行 ndk-gdb 留出時間。
   開始正式的調試:
   先運行項目的 java 調試,程序會運行到調用 本地庫函數之前的斷點處停下來,
   這個時候趕緊運行 終端 進入工程目錄,然後運行ndk-gdb ,運行之後是沒有任何輸出的,
   然後啓動 C/C++ 的 debug,即上面配置好的那個:
   右鍵點擊 工程名 ,選擇菜單 [Debug As] 或主菜單 [Run] -> [Debug Configurations...],
   彈出 "Debug Configurations"窗口,
   在窗口左窗欄中 雙擊 C/C++ Application,其下才會出現 工程名 Default 選項,就是這個!
Ubuntu <wbr>下用 <wbr>Eclipse <wbr>編譯調試 <wbr>Android <wbr>NDK <wbr>工程
  
   Android的模擬器是可以正常使用超級用戶的權限的,
   當你是用真機設備調試的時候請確保你的真機設備已經 root,
  否則會出現一些權限的錯誤,甚至導致莫名奇妙的問題...

對於 ndk-build 可編譯成功並無任何錯誤、警告的代碼,Eclipse 提示如下相關的錯誤:
"Symbol is not resolved"
"Member declaration not found"
"Invalid template argument"
"Invalid arguments"
"Method cannot be resolved"
等等

我的這個解決方案,可能並非完美解決方案,但是至少它將讓你通過 Eclipse 點擊 運行 或 調試 :
1.右鍵點擊你的 Android 工程並選擇屬性;
2.在 C/C++ General 下點擊 Code Analysis 項;
3.選擇 Use project settings 單選項框;
4.將 Syntax and Semantic Errors 下的與 C++ 有關的實際能編譯過去,但 Eclipse 報錯誤的,由錯誤 改成 警告 。

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