第一节 NDK初探



第一节 NDK初探

前言

第一次写博客,之前总说自己文笔不好,怕写不好,所以就一直没勇气下手,现在在学习NDK,为了防止学过去又忘掉,所以权当在此做笔记了.我也会慢慢学习怎么写比较容易理解.

博客是跟着上课进度写的,本门课程是由潭州教育学院的尧金老师主讲,博客有些内容也是引用老师上课时使用的PPT,或者笔记.

如有错误,烦请指正.转载请注明出处!

在这里附一下Google android 开发 中文网站.

https://developer.android.google.cn/index.html

便于查找资料.


目录

1.NKD初探

2.环境搭建

3.C/C++基础

1) 数据类型

2)数组


正文


一. NDK初探

先来熟悉两个概念NDK和JNI.

1.什么是NDK:NDK是Native Development Kit(本地开发工具包)的简称,意思在括号里说明了,它是个工具包,NDK中提供了一系列的工具,帮助我们快速开发C/C++的动态库,生成so文件,并能自动将so文件 和java 文件一起打包成apk.

作用是让Java代码调用C/C++代码.

2.什么是JNI:JNI全称为Java Native Interface(Java本地化接口),是Java调用C/C++的一套编码规范.

注意记住:NDK基于JNI

3.为什么使用NDK

1.安全.代码的保护作用,由于apk的java层代码很容易被反编译,而C/C++库反编译难度较大.

2.硬件(java不能直接访问)和性能(图像处理).硬件方面,java不能直接控制硬件如音频等.而C/C++可以,性能方面C/C++在某些方面是JAVA效率的5-10倍,是JAVA不能实现的.

3.便于移植(跨平台)

4.借助了C/C++优秀第三方开源库

二.AndroidStudio下NDK环境搭建.

配置安卓开发环境的内容百度一大把,我就不再赘述了,下面内容是从配置完AndroidStudio开发环境后开始.

1.安装androidstudio环境下的NDK插件

在工具栏点开File->Settings->Appearance&Behavior->System Settings ->Android SDK

,在右侧选择SDK Tools.然后将下面的CMake,LLDB,NDK选上,然后点击ok,等待下载即可.

要说明的是下载NDK可能需要*,我当时下载的时候网速比较差,下载了两次,第一次没有进行*,CMake,LLDB;可以下载下来,但是NDK下载时链接超时,后来挂上v*n后顺利下载.在此我没有进行验证,仅供参考.


第一节 NDK初探
设置界面  勾选红框里的三项

2.新建androidstudio 下的NDK项目

1)新建项目,填写项目名称,并勾选 include c++ support

勾选了这项,表示我们要是加入c/c++层开发.然后点击下一步next,选择创建合适的项目


第一节 NDK初探
勾选 include c++ support

2)到这个界面(见下图)

C++ Standard不用管,使用默认的Tookhain Default,下面的两个选项都勾选上.

1.勾选exception support(支持异常处理)

即当我们C/C++代码出现异常时,会像我们写java代码时出现异常一样在控制台打印异常信息.不勾选的话就不会打印,所以为了开发方便,我们必须勾选.

2.勾选runtime type information support(支持运行时类型信息)

即我们可以像java代码一样打印log信息.如果不勾选,当然就不能打印了.

勾选完毕,点击Finish.

第一节 NDK初探
勾选下面两项

创建好项目,我们进入进入Project视图,会发现main文件下多了cpp文件夹,我们进行C/C++开发就是在这个包下进行.里面有一个native-lib.cpp文件.上面LogUtils.h文件是我自己加的,请先无视.我们之后会说明.


第一节 NDK初探
cpp文件夹

MainActivity,native-lib.cpp文件在右侧文本编辑区已经自动打开.我们会发现MainActivity中除了onCreate()方法,还多了个stringFromJNI()方法.这个方法就是在native-lib.cpp下进行定义的.而我们的onCreate()里也进行了调用.


第一节 NDK初探
MainActivity中调用本地函数

而在native-lib.cpp里我们会看见一个带着MainActivity包路径的方法,路径后面跟的正是我们MainActivity里的方法名.而这个方法里我们可以看到一个字符串"Hello from C++".

第一节 NDK初探
cpp文件中的本地函数

我们直接运行项目,会看到屏幕上打印的"Hello from C++".

下面我们开始学习c/c++基础.

三. c/c++基础

一 .数据类型

第一节 NDK初探
数据类型

数据类型分为5大类,分别是基本类型,构造类型,指针类型,引用类型,空类型.

1.基本类型

基本类型分为整型,字符型,浮点型,布尔型.

1)整型

短整型(shortint)16bit 2字节 无符号短整型0-65535

整型(int)16bit 2字节

长整型(longint)32bit 4字节

C++标准规定了每个算术类型的最小空间,但是不阻止编译器使用更大的空间

2)浮点型

下面的有效数字指的是小数点后的位数。

单精度(float)只能保证6位有效数字

双精度(double)至少保证10位有效数字

长双精度(longdouble)至少保证10位有效数字,但是比double提供的精度更高

3)字符型

char 8 bit

4)布尔型

bool 只有0代表假(false),非0即为真(true)

以下内容有些跟java相似,简单提一下.其他类型后面详细讲,我们先记住都有哪些类型.

2. 构造类型

1)枚举类型(enum)-与java相似.

2)数组类型

3)结构体类型(struct)

4)共用体类型(union)

5)类类型(class)

3.指针类型

4.引用类型

5.空类型

注:类类型和引用类型是C++比C中新增加的类型.指针类型和引用类型不是同一种类型.

二.数组

由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的数据类型,维数指定数组中包含的元素个数

1.一维数组

1-定义一维数组

      类型名  标识符[维数];

如:int a[3];表示定义一个int型数组,标识名称为a,a数组有三个元素.

2-引用一维数组中的元素

标识符[维数];

如: a[0]  表示取a数组中第一个元素.

3-一维数组的初始化

可以在定义时初始化(可以不写维数),也可以在使用前初始化(必须写维数),维数在使用之前,必须是一个固定的值(因为数组的长度是固定的)

定义时初始化:

                      int a[ ] = {0,1,2};

定义时不初始化,使用前初始化:

                      int a[3];

                      a[0] = 0;

                      a[1]= 1;

                      a[2] =2;

2.二维数组

1-定义二维数组

类型名标识符[维数][维数];

如:int b[2][3];

2-二维数组的引用

标识符[维数][维数];

如 :b[0][0]        表示取第一行第一个元素

3-二维数组的初始化

1)二维数组的初始化会自动补0

        int b[2][3] = {1,2,3,4};

上面我们要创建一个2行3列的数组,需要6个值,而我们只给了4个值,没关系,系统会自动往后面补0.所以第一行是1,2,3.第二行4,0,0.

2)如果提供了全部的元素,那么定义时第一维可以省略,但第二维不能省略;

int b[][3]={1,2,3,4,5,6,7};

上面的数组,指明列数为3,但是没有给明行数.系统会按元素个数依次赋值,不足的补0.所以会产生3行数据.第一行1,2,3;第二行4,5,6;第三行7,0,0.


第一节 NDK初探
二维数组



先说道这里.不知道简书是怎么贴代码的,有知道的烦请告知.