歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 教你學會Android的NDK開發

教你學會Android的NDK開發

日期:2017/3/3 12:50:00   编辑:Linux技術
一.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,鏈接:' target='_blank'>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
Copyright © Linux教程網 All Rights Reserved