Android NDK R9環境配置,開發教程
NDK是一個工具集,可讓您實現您的應用程式使用機器碼的語言,如C和C + +。Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google稱為“NDK”。
在此之前,Android平台的第三方應用程式均是依靠基於Java的Dalvik特製虛擬機器進行開發的。原生SDK的公布可以讓開發人員更加直接的接觸Android系統資源,並使用傳統的C或C++語言編寫程式,並在程式封包檔案(.apks)中直接嵌入原生庫檔案。
NDK的公布可以讓開發人員更加直接的接觸Android系統資源,並使用傳統的C或C++語言編寫程式,並在程式封包檔案(.apks)中直接嵌入原生庫檔案。NDK的公布讓原來從事C語言開發人員也參與到Android平台,也讓java開發人員方便的調用底層操作,特別是遊戲開者,對引擎,速度等要求較高者,有了新的工具來實現所需功能,做出更加完美的程式。
對於某些類型的應用程式,這可以是有益的,所以你可以重用現有的程式碼程式庫,這些語言編寫的,但大多數應用程式不需要NDK。
Android NDK R9更新:
Android NDK R9 主要是為了Android 4.3開發準備的。
隨著Android 4.3平台的發布,Google還發布了Android NDK (r9)的更新版本。新的NDK允許你本地訪問Android 4.3中的OpenGL ES 3.0 API以及其他穩定的API。如果你在遊戲或應用中使用了高效能圖形功能,可以採用該版本。
Android NDK 是什嗎?
Android NDK全稱:Native Development Kit,即本地開發包。
1、NDK是一系列工具的集合。
NDK提供了一系列的工具,這些工具對開發人員的協助是巨大的。它們能協助開發人員快速開發C(或C++)的動態庫,並能自動將so庫和java應用一起打包成apk。
NDK整合了交叉編譯器,並提供了相應的mk檔案隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk檔案(指出“哪些檔案需要編譯”、“編譯特性要求”等),就可以建立出so庫。NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK提供了一份穩定、功能有限的API標頭檔聲明。Google明確聲明該API是穩定的,在後續所有版本中都穩定支援當前發布的API。從該版本的NDK中看出,這些API支援的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
Android NDK配置教程:工具環境(Android Developer Tools,android-ndk-r9d,Android4.3 API18)
對於Windows環境下NDK的開發,如果使用的NDK是r7之前的版本,必須要安裝Cygwin才能使用NDK;從r7開始,Google的提供了一個ndk-build.cmd的指令碼,可以直接用它編譯,而不需要使用Cygwin了。可以通過,配置path變數,直接在cmd下面運行ndk-build命令即可對android工程中的項目進行編譯了。
1,JAVA_HOME : C:Program Files (x86)Javajdk1.7.0_17 (jdk的安裝目錄)
2,CLASSPATH: .;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar (固定不變)
3,ANDROID_NDK_HOME: D:android-ndk-r9d (ndk的解壓的目錄)
4,PATH: 將這 “%JAVA_HOME%in; %ANDROID_NDK_HOME%;”加到原有的後面。
5,test
在 cmd 中 輸入 java –version,ndk-build –h ,沒有出現
“xxx不是內部或外部命令”即成功
Android NDK開發教程(請按照教程順序操作,本人親測)
工具環境(Android Developer Tools,android-ndk-r9d,Android4.3 API18)
1, 在 ant中(eclipse),建立一個android項目(NDKhi)。
2, 在 src下的com.example.ndkhi 建立 jniClient.java 檔案。
此檔案作用:
1,載入本地C庫檔案(.so)。
2,聲明本地C庫中的方法(static public native String sayHi())。
jniClient.java源碼:
package com.example.ndkhi;
public class jniClient {
static {
System.loadLibrary(Ndkhi);
}
static public native String sayHi();
}
3, 編譯android檔案
eclipse預設自動編譯。在目錄 workspaceNDKhiinclassescomexample dkhi 中 尋找 jniClient.class 檔案是否存在,若不存在,手動編譯android工程。
4, 使用 javah 工具 產生 c語言的.h標頭檔
在 工程NDKhi 中建立一個 名為 jni 的檔案夾,開啟window cmd,cd到jni目錄下,
輸入 javah –classpath ../bin/classes/com.example.ndkhi ,若命令執行成功,會在jni目錄中產生 com_example_ndkhi_jniClient.h 檔案。
重新整理 eclipse中的工程NDKhi,即可見com_example_ndkhi_jniClient.h 檔案。
com_example_ndkhi_jniClient.h源碼(此檔案為自動產生,一般不用修改):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_example_ndkhi_jniClient */
#ifndef _Included_com_example_ndkhi_jniClient
#define _Included_com_example_ndkhi_jniClient
#ifdef __cplusplus
extern C {
#endif
/*
* Class: com_example_ndkhi_jniClient
* Method: sayHi
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_ndkhi_jniClient_sayHi
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
5, 編寫c語言程式
在jni目錄下,建立 名為 com_example_ndkhi_jniClient..c 的檔案,實現 com_example_ndkhi_jniClient.h中聲明的函數即可。
com_example_ndkhi_jniClient..c源碼:
#include
JNIEXPORT jstring JNICALL Java_com_example_ndkhi_jniClient_sayHi
(JNIEnv *env, jclass arg)
{
return (*env)->NewStringUTF(env, android ndk hi!!!);
}
6,Android.mk 檔案(簡單理解為 makefile)
在 jni目錄下,建立 名為Android.mk 檔案。
內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Ndkhi
LOCAL_SRC_FILES := com_example_ndkhi_jniClient.c
include $(BUILD_SHARED_LIBRARY)
修改xxx.c檔案,和 Ndkhi 為自己建立的.c檔案,的要產生的.so
7, 編譯,連結C程式
開啟windows cmd,cd到 workspaceNDKhi 目錄下,輸入 ndk-build 命令
若成功如:
編譯連結成功後,會在 工程NDKhi的libs/armeabi/下 產生 libNdkhi.so,
8, 編寫MainActivity.java。
源碼:
package com.example.ndkhi;
import android.os.Bundle;
import android.R.string;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tView = (TextView) findViewById(R.id.tv);
String strHi = jniClient.sayHi();
tView.setText(strHi);
}
}
9,運行android 工程 NDKhi