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

京魚網www.jingfish.com


、開發環境搭建:
1.首先,要給 Eclipse 安裝 CDT :
選擇菜單 [Help] -> [Install new software...],
彈出 "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>工程

在安裝了CDT插件後,要指定編譯器。Project->Properties->C/C++Build ->Builder Settings->Build Command:在這裏指定你的編譯器的路徑,我們這裏用的是ndk-build,指定它所在的路徑就好了。Build location:指定的是你的工程目錄。



2.然後,要給 Eclipse 安裝 Sequoyah :
選擇菜單 [Help] -> [Install new software...],
彈出 "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 Native Support...],
彈出 "添加 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/classes wzh.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 be resolved 源代文件名.c /TestJNIC/jni line 6 Semantic Error  
Type 'JNIEnv' could not be resolved 源代文件名.c /TestJNIC/jni line 4 Semantic Error  
Type 'jobject' could not be resolved 源代文件名.c /TestJNIC/jni line 4 Semantic Error  
Type 'jstring' could not be resolved 源代文件名.c /TestJNIC/jni

解決辦法:
右鍵點擊 工程名 ,選擇菜單 [Properties],
彈出 "Properties for 工程名" 窗口,
在窗口左窗欄中選擇 C/C++ General -> Paths and 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 to make target `工程名_scd.mk'. Stop. 工程名 [Discovery Options] page in project properties C/C++ Problem

解決辦法:
右鍵點擊 工程名 ,選擇菜單 [Properties],
彈出 "Properties for 工程名" 窗口,
在窗口左窗欄中選擇 C/C++ Build ,
在窗口右窗欄中選擇 Builder Settings 選項頁,
去掉 Use default build command 複選框的對勾,
修改 Build command: 後面文本框中 ndk-build 爲全路徑!
在窗口右窗欄中選擇 Behaviour 選項頁,

修改 Build(Incremental build) 後面文本框將 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 組下的


Select configuration using 'C/C++ Application' 複選框打上勾;


Disable auto build 單選框被選中;


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

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

在窗口右窗欄中選擇 Debugger 選項頁,
修改 Debugger: 下拉列表框選項爲 gdbserver
修改 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 console mode 記得勾上,才能在 Eclipse 控制檯中用指令來與 gdb 交互。

在 Debugger Options 組下的 Connection 選項頁中
修改 Type: 下拉列表框的值爲 TCP
修改 Host name or IP address: 文本框的值爲 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 報錯誤的,由 錯誤 改成 警告 。
ndk-build 編譯時將會捕捉到每一個無論何種方式地真實的錯誤,所以不會有什麼隱患,
對正確的 C++ 代碼報錯,可能是 Eclipse 的 bug !
(注:如果你知道更好的解決方案,請留言或發電子郵件告訴我啊,在此先謝過了 :))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章