通過簡單的示例開始使用 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,如下所示

StackOverflow 文件

然後在終端中,它最初將包含專案的路徑

新增 cd app/src/main

路徑將從專案路徑擴充套件到 main。

接下來,再次構建 - 製作專案(Ctrl + f9)。

現在你將在 app-build-intermediates-classes-debug 資料夾下找到,如下所示。

StackOverflow 文件

現在,在 app / src / main / java 下建立一個新的 Java 類檔案,在這裡我建立了一個名為 NativeClass 的 java 檔案

StackOverflow 文件

編寫一個簡單的呼叫函式,函式名稱和函式輸入,這裡我寫了函式作為例子,給它兩個整數輸入,

StackOverflow 文件

再次構建專案 (Ctrl + f9)

在構建時,你會發現在這樣的構建下建立的類檔案,

StackOverflow 文件

Then,in terminal 
    `-Javah  -d  jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass

其中, - d - 用於輸出目錄 - jni -Generate JNI 樣式標頭檔案(預設) - 類路徑 - 為其載入類

現在構建專案(Ctrl + f9),你將找到建立的 jni 資料夾,並且將建立一個**標頭檔案,**其中包含你在終端中指定的名稱,如下所示

StackOverflow 文件

現在複製標頭檔案並儲存為 jni 資料夾中標頭檔案同名的 .cpp 或 .c 檔案。

我建立了一個 cpp 檔案,如下所示

StackOverflow 文件

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

StackOverflow 文件

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

StackOverflow 文件

 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 檔案。

StackOverflow 文件

然後現在執行應用程式,你將獲得此示例的輸出為 10。

StackOverflow 文件

這是 NDK 初學者的基本程式,可以在這裡匯入 OpenCV 庫,也可以進行影象處理應用程式。