一.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