通过简单的示例开始使用 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 库,也可以进行图像处理应用程序。