android-ndkandroid-ndk入门


备注

什么是Android NDK?

Android原生开发工具包(NDK)是Android SDK的配套工具,允许部分应用程序内置在C / C ++中。这对以下内容很有用:

  • 跨平台(Android,iOS,Linux等)共享应用程序组件
  • 提高关键部分的性能
  • 重用现有的C / C ++库

NDK提供了头文件和库,允许开发人员构建活动,处理用户输入,使用硬件传感器,访问应用程序资源等 - 在C / C ++中编程。

版本

发布日期
R12 2016年6月9日
R11 2016年3月9日
R10 2014年7月1日

通过简单的示例开始使用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.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

在此处输入图像描述

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库,也可以进行图像处理应用程序。