1. 程式人生 > >從零開始使用Eclipse搭建NDK專案

從零開始使用Eclipse搭建NDK專案

本部落格預設是在已經配置好JDK環境變數和eclipse開發環境的前提下操作.
  • 事前準備:

下載android-ndk-r10e-windows-x86_64.exe  

下載完成後把檔案移動到工作目錄,注意路徑中不要帶有中文和空格. 

雙擊exe檔案會執行解壓,但是解壓是預設解壓到檔案所在目錄,所以在解壓前移動到工作目錄是很有必要的,因為解壓出來的檔案大概3G左右,這大概需要十分鐘.如果發現目錄錯了,但是你想移動到本盤內其他位置,直接移動就行,但是如果跨盤的話,不要嘗試複製過去,因為這裡有無數的小檔案,速度會非常慢,不如把400M的exe檔案移動過去再執行一次解壓來的方便.

配置NDK地址:

windows->preferences->Android->NDK,選擇NDK目錄.

  • 開始搭建:
1.首先,建立一個Android專案.一路next下去.這裡我是基於4.0建立的.


2.右鍵點選專案->Android Tools -> Add Native Support.



    此時工程目錄下會多出一些資料夾:jni,obj.jni資料夾是存放natvie程式碼的,obj是存放生成的庫檔案之類的.


3.然後建立GetString類
public class GetString {
	public static native String getStr();
	public native String getString();
	public native int add(int a, int b);
}

4.開啟cmd命令列,進入專案的<專案地址>/bin/classes/下.輸入javah -jni <包名>.類名

這裡使用了javah命令,這個命令是jdk裡的,jre裡是沒有的.

如:<專案目錄>\bin\classes>javah -jni com.zzk.hellojni.GetString

該命令的作用是對GetString類生成.h標頭檔案.成功後會在\bin\classes\下生成一個.h檔案.

把這個檔案複製到工程jni檔案下.

此時會報錯,提示Type 'JNIEnv' could not be resolved,是因為專案沒有include 執行環境.

右鍵專案->properties->C/C++general->Paths and Symbols

點選Add按鈕

勾選Add to all languages.點選File system,選擇之前準備好的NDK目錄下的\platforms\android-14\arch-arm\usr\include目錄.注意NDK路徑地址不能有漢字和空格!!!否則會報錯.platforms最好選和專案sdk一致的版本.arch開頭的三個目錄應該是和cpu構架相關的,android絕大數的裝置都是arm構架的.

點選OK,點選Apply,會提示是否重構專案,點選確定.此時專案不再報錯.

5.建立一個NDK Builder構造器.

右鍵專案->properties->builders->New.選擇Program.然後彈出一個對話方塊.這裡需要配置一下.

Main標籤:Location選擇NDK的根目錄.Working Directory選擇工程目錄.

Refresh標籤:勾選Refresh resources upon completion.看圖吧.

Build Options標題:勾選框框內的.然後點選Specify Resources

選擇專案裡的jni資料夾.

點選finish,此時這裡就多了一個NDK_Builder

點選ok,會執行構建操作,此時如果出現下列資訊就表示成功了.

6.然後把之前的.h檔案裡的三個未實現的方法複製到.cpp內,然後實現方法.#include 標頭檔案不要忘掉.

然後點選project->build project.等待構建成功後obj資料夾下會多出一些檔案.

libHelloJNI.so 就是最後生成的動態庫.

7.最後在MainActivity中呼叫GetString類的方法.顯示到介面上.
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv = (TextView) findViewById(R.id.tv);
		String str = GetString.getStr();
		str += "\n" + new GetString().getString();
		str += "\n" + new GetString().add(5, 3);
		tv.setText(str);
	}

}

執行會報錯,提示:


這是因為程式碼中沒有載入動態庫.回到GetString類中,新增方法.


現在執行專案,可以看到介面上已經成功顯示了三個native方法返回的值.


  • 參考連結: