通過簡單的示例開始使用 Android NDK
使用 Android Studio 2.2 和更高版本的 Native Development Kit(NDK)
,你可以使用它來編譯 C 和 C++程式碼。
你可以通過手動下載 NDK 並構建它或通過 CMake 來使用 NDK。
在這裡,我將給出手動安裝 NDK 和示例程式碼的流程,
根據你的系統作業系統,你可以從此位置下載 NDK :https://developer.android.com/ndk/downloads/index.html 。
下載後,將系統環境變數中的路徑作為變數名稱NDK_PROJECT_PATH和變數值“NDK 儲存路徑的位置”。
-
接下來,在建立新的 android 專案之後,將 NDK 與 Android Studio 整合,
在 gradle - 本地屬性中新增 sdk 路徑的位置
sdk.dir=F\:\\gowtham\\Android\\sdk
和
android.useDeprecatedNdk = true
-
然後,按 Build - Make Project(Ctrl + f9)。
你的專案將成功構建,並將在訊息 gradle 構建中獲得 BUILD SUCCESFUL,如下所示
然後在終端中,它最初將包含專案的路徑
新增 cd app/src/main
路徑將從專案路徑擴充套件到 main。
接下來,再次構建 - 製作專案(Ctrl + f9)。
現在你將在 app-build-intermediates-classes-debug 資料夾下找到,如下所示。
現在,在 app / src / main / java 下建立一個新的 Java 類檔案,在這裡我建立了一個名為 NativeClass 的 java 檔案
編寫一個簡單的呼叫函式,函式名稱和函式輸入,這裡我寫了函式作為例子,給它兩個整數輸入,
再次構建專案 (Ctrl + f9) ,
在構建時,你會發現在這樣的構建下建立的類檔案,
Then,in terminal
`-Javah -d jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass
其中, - d - 用於輸出目錄 - jni -Generate JNI 樣式標頭檔案(預設) - 類路徑 - 為其載入類
現在構建專案(Ctrl + f9),你將找到建立的 jni 資料夾,並且將建立一個**標頭檔案,**其中包含你在終端中指定的名稱,如下所示
現在複製標頭檔案並儲存為 jni 資料夾中標頭檔案同名的 .cpp 或 .c 檔案。
我建立了一個 cpp 檔案,如下所示
Delete everything before **JNIEXPORT line** in this file and **add header file name** alone.
Here I am for simple example just adding two numbers and returning value to android java.
Application_com_ndkapplication_NativeClass.cpp
#include <application_com_ndkapplication_NativeClass.h>
JNIEXPORT jint JNICALL Java_application_com_ndkapplication_NativeClass_example
(JNIEnv *, jclass , jint as , jint bs){
return (as + bs);
}
對於此示例,無需在其標頭檔案中新增任何函式。
在 Jni 資料夾中建立名為 Android.mk 和 Application.mk 的新檔案
Android.mk 檔案用於描述構建系統的原始碼。
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := application_com_ndkapplication_NativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := exp-jni
include $(BUILD_SHARED_LIBRARY)
要了解此檔案的詳細資訊,請閱讀此連結 https://developer.android.com/ndk/guides/android_mk.html
Application.mk,描述了你的應用所需的本機模組。
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti –fexceptions
APP_ABI := armeabi-v7a armeabi arm64-v8a mips mips64 x86 x86_64
APP_PLATFORM := android-16
要了解此檔案的詳細資訊,請閱讀此連結 https://developer.android.com/ndk/guides/application_mk.html
Now build the project again **(Ctrl + f9)**, you will find the **armeabi-v7a, armeabi, arm64-v8a ,mips, mips64, x86 and x86_64** folder created inside jniLibs.
然後,在 main 活動中傳遞輸入並獲取本機類檔案的輸出。
int a = 5, b = 5, res ;
res = NativeClass.example(((int) a),((int) b));
TextView textView = (TextView) this.findViewById(R.id.tv);
textView.setText(new Integer(res).toString());
這裡我通過 a,b 給出了兩個整數輸入,並從變數 res 獲得輸出。
並通過傳遞給 TextView 在螢幕上顯示獲得的輸出。
並且不要忘記將你在 Android.mk 檔案中指定的庫新增為 **LOCAL_MODULE,**如下所示,
static {
System.loadLibrary("exp-jni");
}
最後再次構建專案(Ctrl + f9),你將找到在每個 armeabi-v7a,armeabi,arm64-v8a,mips,mips64,x86 和 x86_64 資料夾下建立的 .so 檔案。
然後現在執行應用程式,你將獲得此示例的輸出為 10。
這是 NDK 初學者的基本程式,可以在這裡匯入 OpenCV 庫,也可以進行影象處理應用程式。