1、Android NDK簡介 NDK全稱為native development kit本地語言(C&C++)開發包。而對應的是經常接觸的Android-SDK,(software development kit)軟件開發包(只支持Java語言開發)。 簡單來說利用NDK,可以開發純C&C++的代碼,然后編譯成庫,讓利用Android-SDK開發的Java程序調用。NDK開發的可以稱之為底層開發或者jni(java native interface)層開發,SDK開發可以稱為上層開發。 2、為何要用NDK 2.1、眾所周知,利用SDK編寫的代碼,生成的APK,很容易就可以反編譯了,安全性極為不高,而利用NDK開發的庫,不容易被反編譯,保密性,安全性都提高了。 2.2、很多開源工程和大型工程都是C&C++代碼,把它們轉換為純java語言顯然是不可能的。 2.3、C&C++的代碼運行速度和效率都比java快很多。 3、NDK環境的搭建 在http://developer.android.com/sdk/ndk/index.html下載最新版的NDK,然后解壓到你喜歡的位置,然后把NDK的所在的目錄,配置到環境變量里面就行。 如我在windows下面用cygwin開發。配置環境變量可以參考http://blog.csdn.net/conowen/article/details/7518870 簡單來說就是在Linux或者cygwin的安裝目錄,跳轉到/home/YourName/,然后編輯.bash_profile文件,在末尾添加如下語句,具體根據自己的情況而定。 [java] view plain copy print?在CODE上查看代碼片派生到我的代碼片 ndk=/home/conowen/android-ndk-r7b export ndk 4、新建一個NDK工程 新建一個目錄,命名為HelloWorld,然后在里面新建一個名為jni的目錄(名稱一定要是jni,因為ndk-build的時候會在HelloWorld目錄下尋找jni的目錄,然后進行build),在jni目錄下新建如下文件HelloWorld.c和Android.mk。 HelloWorld.c文件代碼如下(此JNI是沒有jni_onLoad函數的) [java] view plain copy print?在CODE上查看代碼片派生到我的代碼片 #include <string.h> #include <jni.h> jstring Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !"); } /*注意,這里 jstring 表示返回值 Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 寫法是Java+Android工程的包名+Android工程的Activity名+方法名,點號用下划線表示,這個寫法很嚴格。 包名:com_conowen_helloworld Activity名:HelloWorldActivity 方法名:helloWorldFromJNI JNIEnv* env, jobject thiz是Native方法自帶的參數,可以用來轉換一個數據類型。也就是說其實這個helloWorldFromJNI是沒有形參的。 */ Android.mk代碼如下 關於Android.mk的編寫格式,下一篇博文補全 [java] view plain copy print?在CODE上查看代碼片派生到我的代碼片 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #LOCAL_MODULE表示生成的庫的名字,前面的lib和后綴名不用寫 LOCAL_MODULE := HelloWorld LOCAL_SRC_FILES := HelloWorld.c include $(BUILD_SHARED_LIBRARY) 然后在終端里面,轉到HelloWorld目錄下,執行 [java] view plain copy print?在CODE上查看代碼片派生到我的代碼片 $ndk/ndk-build $ndk是之前配置的NDK環境變量。編譯成功后,會在在目錄生成libs和obj兩個文件夾,libs里面有剛剛編譯成的libHelloWorld.so庫。 5、新建一個Android工程 在eclipse里面新建一個Android工程,java代碼如下,然后把剛剛生成的libs文件夾拖到Android工程目錄下。 [java] view plain copy print?在CODE上查看代碼片派生到我的代碼片 package com.conowen.helloworld; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(helloWorldFromJNI()); setContentView(tv); } public native String helloWorldFromJNI();// native聲明,表示這個方法來自Native層。實現過程已經在native層實現了 static { System.loadLibrary("HelloWorld");// 加載庫,前面的lib和,后綴名不用寫 } }