教你學會Android的NDK開發

一.NDK是什麼

  NDK是Native Development kit的縮寫,即本地開發工具包,它支持用C/C++方式來開發Android,而SDK是用Java來開發Android。這樣在安卓平臺上就實現了Java+C/C++的開發方式。兩者可以通過JNI (Java Native Interface)來互相調用。關於它們的關係如下圖所示:

    

二.NDK的作用

     1.便於程序的移植,實現跨平臺

     2.提高程序的性能,像一些特定模塊,比如圖像處理,音視頻開發等

     3.防止核心代碼被反編譯,     

 三.編寫一個NDK的例子

      1.下載Android NDK

      下載地址: 點擊打開鏈接(需要翻牆),也可以去百度上搜一下

       下載下來如圖:   我的是NDK8

           

如果你用的是NDK7之前的版本,那麼你還需要去下載cygwin軟件,它模擬了Linux環境,下載地址:點擊打開鏈接, 具體的環境配置我就不過多介紹了.

當然已經沒必要去這樣弄了,NDK7之後的版本已經集成了Linux編譯環境,操作簡單的多. 

      2. 在eclipse中集成C/C++開發環境 ADT 

      (1).下載ADT,鏈接: http://www.eclipse.org/cdt/downloads.php  ,找到自己eclipse對應的版本,可以在eclipse中的.eclipseproduct文件中看到版本信息

      如圖:

                    

  在下載頁面有對應的ADT版本,是與版本名稱對應的,如圖

              

         我的4.2,對應Juno,則在下載頁面對應Juno

           


  (2)複製這個鏈接,打開eclipse上的help菜單,選擇Install New Software選項,彈出一個窗口

      (3)點擊Add,把複製的鏈接粘貼進去,出現插件列表後點擊Selec tAll,  然後next下一部,就可以等待安裝完成了

      

3.Eclipse關聯ndk-build

        這樣不用我們打開ndk-build命令去手動編譯了,eclipse自動編譯,多省事大笑

      (1).Project->Properties->Builders->New,新建一個Builder

     

     (2).輸入name, Location輸入ndk-build的路徑,Working Directory輸入自己項目路徑

     

(3)點擊Refresh選項

        

      (4).點擊Build Options選項

). 

  (5).點擊Specify Resources

  

    4.新建一個android工程,在MainActivity裏輸入如下代碼

public class MainActivity extends Activity {
 	// 1.定義一個本地方法
	public native String fromc();

	// 2.加載so文件
	static {
		System.loadLibrary("hello_jni");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button1 = (Button) findViewById(R.id.button1);

		button1.setOnClickListener(new OnClickListener() {
 		    @Override
			public void onClick(View v) {
				// 3.談一個吐司,內容是從C++實現的
				Toast.makeText(MainActivity.this, fromc(), 0).show();
			}
		});

	}
}
這個hello_jni的so文件需要我們先編寫C++代碼,然後自動編譯生成.我們新建一個jni目錄,再新建一個hello.c文件.

            

   hello.c代碼中,jstring表示返回字符串類型,這裏方法名要注意,前面以Java開頭,後面加上包名類名方法名,中間用下劃線分割

     不要忘了加上string.h,jni.h等頭文件

#include <string.h>
#include <jni.h>

//jstring 表示返回字符串
//傳入env,obj參數
//調用NewStringUTF方法
//
jstring Java_com_example_ndkdemo_MainActivity_fromc(JNIEnv* env,jobject obj)
{

      return (*env)->NewStringUTF(env,"hello");

}

最後編寫Android.mk文件, 放在jni目錄下,mk文件及makefile文件,指定了編譯的配置信息.       

LOCAL_PATH := $(call my-dir)    //LOCAL_PATH變量,用於查找源文件,固定的寫法
include $(CLEAR_VARS)           //指定讓GNU MAKEFILE爲你清除許多LOCAL_XXX變量,固定寫法
LOCAL_MODULE    := hello_jni    //表示編譯生成的名稱
LOCAL_SRC_FILES := hello.c      //表示要編譯的模塊
include $(BUILD_SHARED_LIBRARY) //編譯生成共享庫
當你寫好mk文件後,保存之後會發現源代碼目錄多了個obj目錄,裏面就有我們要的so文件.


     現在把你的程序運行起來就可以了。  

       Demo地址: 點擊打開鏈接 密碼:ms4v


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章