穿戴设备之一 【Android NDK开发之从环境搭建到Demo】

版权声明:我是南七小僧,微信: to_my_love ,寻找人工智能相关工作,欢迎交流思想碰撞。 https://blog.csdn.net/qq_25439417/article/details/83898472

我们的穿戴式智慧眼睛项目走到了产品化的阶段,正式进入Android开发,这期间需要将算法编程C ++通过NDK JNI与JAVA配合做Android App的开发。

为什么要这样做,接下来会说明。同时本文也会介绍如何进行混编

正文

说到NDK,相信大家都不陌生,它是Google为便于Android开发提供的一种原生开发集:Native Development Kit,而且也是一个包含API,构建工具,交叉编译,调试器,文档示例等一系列的工具集,可以帮助开发者快速开发C(或C ++)的动态库,并能自动将so和java应用一起打包成APK

与NDK密切相关的另一个词汇则是JNI,它是NDK开发中的枢纽,Java与底层交互绝大多数都是通过它来完成的,那么接下来看看什么是JNI?

JNI:Java Native Interface也就是java本地接口,它是一个协议,这个协议用来沟通java代码和本地代码(c / c ++)。通过这个协议,Java类的某些方法可以使用原生实现,同时让它们可以像普通的爪哇方法一样被调用和使用,而原生方法也可以使用的Java对象,调用和使用的Java方法也就是说,使用JNI这种协议可以实现:用Java代码调用C / C ++代码,而C / C ++代码也可以调用的Java代码。

那为什么要使用NDK开发呢?

  • 我们都知道,java的是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用Ç语言来编写这些重要的部分,来增大系统的安全性。

  • 在一些复杂性的计算中,要求高性能的场景中,C / C ++更加的有效率,代码也更便于复用。

当然还有其他的优点,这些都驱使我们选择相对来说高效和安全的DNK来开发我们的应用程序。

OK,说了那么多NDK,那到底怎么使用NDK来开发应用程序呢?

俗话说,工欲善其事必先利其器,想要使用NDK开发,必先打磨好工具。那下面首先来看看DNK的环境搭建吧。

NDK的环境搭建

https://developer.android.google.cn/ndk/downloads/

  1. 安装配置NDK

    首先下载NDK,这里我使用的是Android的NDK-R14B窗口-x86_64的,可以自主选择。

    1)。解压NDK的拉链包,路径注意目录不要出现空格中文English状语从句:,这里建议大家把包解压到SDK目录里面,并命名为NDK束,好处是,启动AS的时候会检查它并直接添加到ndk.dir中,减少我们的配置工作;

    2)。配置路径:把解压好的路径添加到环境变量path中;

    3).ndk建造:CD到解压后NDK的根目录,执行NDK建造命令。

  2. 给AS配置关联NDK,这里我使用的是androidstudio,使用Eclipse中的会有所不同,请自行查找资料来配置。

    1)。在建立的工程中的local.properties中添加如下配置
    ndk.dir = d:\ guanmanman \ androidStudio \ SDK \ NDK束,这里注意下要使用转义字符“”来进行字符转义如果NDK目录是存放在SDK中,并命名为NDK束,这个配置会自动为添加上去。

    2)。在工程中gradle.properties中添加对旧版本的NDK支持的配置
    android.useDeprecatedNdk =真

OK,到这里我们基本的NDK环境配置已基本完成,那接下来就开始我们的NDK开发旅程吧。

演示实例之调用本地无参方法直接返回字符串

一布局布局

直接在布局中添加一个按钮按钮控件,用于点击调用本地方法:

二 在MainActivity中获取该控件并注册它的点击监听器

三 创建Java2CJNI类及本地方法

在我们的包下直接创建一个Java2CJNI类,并在类里创建一个java2C的本地方法:

四 通过javah命令获取到本地头文件

在项目根目录下,进入main->java目录,全选文件目录栏,直接输入cmd命令并按回车键进入docs命令,在命令中执行javah com.sanhui.ndkdemo.Java2CJNI命令:

执行完javah命令后,会在java当前目录下创建一个.h的头文件

五 在main目录下创建一个jni文件夹,并把(四)中的头文件转移到该文件夹下

打开该文件夹可以看到系统为我们创建好的本地方法头文件。

六 创建实现头文件的.C源文件

在jni目录下创建一个Java2C.c的源文件,通过#include引入我们的头文件com_sanhui_ndkdemo_Java2CJNI.h,并把在头文件下的声明方法JNIEXPORT jstring JNICALL Java_com_sanhui_ndkdemo_Java2CJNI_java2C(JNIEnv *, jobject);复制到我们的Java2C.c中,补全方法参数,并实现一个C字符串“I am From Native C .”的返回:

OK,至此我们的代码已编写完毕,接下来我们需要配置编译后的so名称和支持的cpu类型。

七 在该项目下的build.gradle配置生成的so名称和支持的cpu类型

在android->defaultConfig下添加如下代码:

ndk{
     moduleName "Java2C" //so文件名
     abiFilters "armeabi", "armeabi-v7a", "x86" //CPU类型
}

当然在这里不配置也是可以的,系统会用默认的项目名称作为so文件的名称,并且cpu也将会支持全部类型,只是当我们的项目名称改变的时候,在我们引用加载so文件的地方也需要改变,不改变的话就出现找不到so库的异常,所以,这里配置只是为了便利系统生成我们制定的so文件名,而不是根据项目名称生成。

八 加载so库

在我们创建的Java2CJNI类中加载这么库,主要是为了在我们调用本地方法之前先编译本地源码。

在使用System.loadLibrary(“Java2C”);加载库时,库名一定要与在build.gradle中配置的moduleName名称一致,否则将找不到库。

九生成所以文件

在项目的工具类中选择Build-> Rebuild Project,进行重新编译工程,然后AS会为我们生成so文件,所以文件所在目录为:NDKDemo \ app \ build \ intermediates \ ndk \ debug \ lib下

注意:所以文件命名方式是:LIB +模块名+。所以

十执行调用本地方法

在MainActivity中点击按钮按钮调用本地方法。并通过吐司打印出来。

OK,到这里已经完成了一个DEMO级别的NDK应用开发了,那么来看看我们的执行结果:

接下来,我们先用C ++对图像进行处理,将C ++的算法开发完毕后接入爪哇

猜你喜欢

转载自blog.csdn.net/qq_25439417/article/details/83898472