前言
第一次写博客,之前总说自己文笔不好,怕写不好,所以就一直没勇气下手,现在在学习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下载时链接超时,后来挂上vpn后顺利下载.在此我没有进行验证,仅供参考.
设置界面 勾选红框里的三项2.新建androidstudio 下的NDK项目
1)新建项目,填写项目名称,并勾选 include c++ support
勾选了这项,表示我们要是加入c/c++层开发.然后点击下一步next,选择创建合适的项目
勾选 include c++ support2)到这个界面(见下图)
C++ Standard不用管,使用默认的Tookhain Default,下面的两个选项都勾选上.
1.勾选exception support(支持异常处理)
即当我们C/C++代码出现异常时,会像我们写java代码时出现异常一样在控制台打印异常信息.不勾选的话就不会打印,所以为了开发方便,我们必须勾选.
2.勾选runtime type information support(支持运行时类型信息)
即我们可以像java代码一样打印log信息.如果不勾选,当然就不能打印了.
勾选完毕,点击Finish.
勾选下面两项创建好项目,我们进入进入Project视图,会发现main文件下多了cpp文件夹,我们进行C/C++开发就是在这个包下进行.里面有一个native-lib.cpp文件.上面LogUtils.h文件是我自己加的,请先无视.我们之后会说明.
cpp文件夹MainActivity,native-lib.cpp文件在右侧文本编辑区已经自动打开.我们会发现MainActivity中除了onCreate()方法,还多了个stringFromJNI()方法.这个方法就是在native-lib.cpp下进行定义的.而我们的onCreate()里也进行了调用.
MainActivity中调用本地函数而在native-lib.cpp里我们会看见一个带着MainActivity包路径的方法,路径后面跟的正是我们MainActivity里的方法名.而这个方法里我们可以看到一个字符串"Hello from C++".
cpp文件中的本地函数我们直接运行项目,会看到屏幕上打印的"Hello from C++".
下面我们开始学习c/c++基础.
三. c/c++基础
一 .数据类型
数据类型
数据类型分为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.
二维数组先说道这里.不知道简书是怎么贴代码的,有知道的烦请告知.
网友评论