前言
由于前端时间的两个项目
- Mupdf来支持pdf的批注功能
- 录屏推流
这两个的底层都是采用c和c++写的,并生成了对应的so库,也激发了对应学习的兴趣。
为什么要学这些呢?我是觉得 c语言作为一门古老的语言,却在这么多年的发展仍然屹立不倒肯定是有其存在价值的。他的操作效率这个肯定是顶呱呱的,目前的大部分游戏框架以及ios的obeject-c都有其影子,所以学一学哪怕只是了解,对我以后如果要做对应的开发肯定是有帮助的。
学习目标
能看懂jni对应的c和c++代码,主要涵盖了以下方面:
- jni原理或者说明白jni中的native方法是怎么调用对应so库中的方法的,参数是如何传递的?
- c语言基础知识
- c++基础知识
- makefile相关知识
- CmakeList相关知识
学习过程
C语言
我是看的一个C语言入门经典Pdf,和大部分语言一样,分为一下几块
- 基本数据类型
- 循环+判断
- 数组
- 指针
- 结构化数据(即类似Java中的类)
- 函数
- 流+多线程
我第一个算入门的语言是java,所以一开始看这些的时候总会跟java进行对比
基本数据类型都差不多 我觉得c比java就是多了符号这个概念比如相同的整型int
但c却仔细划分了有符号和无符号取值范围不一样,还有类型所占的字节数量页不一定相同,我并没有细看,感觉到时候要用到了 查一下就是。
循环和判断 数组都感觉类似。
结构化数据其实就是java中的类。通过组合已有的数据类型变成新的数据类型。但是这个和java以及后来的c++中的类区别就是没有了修饰符的概念,里面的所有成员都等于java中的public修饰可以随意改值。
c语言的指针是其核心,这是在java中没有的。刚开始学的时候我就有个问题,java中怎么从来没用到这个概念呢,为什么c中一定要用指针。
答:其实是有的,引用可以看成是一种指针。在函数中如果直接传入两个值作为参数,这个值是原有值的副本,对其做修改(包括struct)并不会影响原来的值。所以如果要改变原来的值就必须使用指针。
经典例子:对调ab两个int的值 直接swap(a,b)是不行的要swap (a,b)
指针操作内存还有其他的便利,还有操作函数。
流和多线程就扫了一下主要是锁的概念一些api使用吧,具体等用到再来补充。
奥对了 忘了个重要的,java中有导包的概念,可以方便的知道某个类有哪些方法可以调用,那c怎么做的 ,c如何让主文件即.c和.cpp中的方法暴露出去给别人用的呢,答案是.h ,通过在.h中定义对应的方法和类的申明,然后其他需要使用这些方法的文件导入.h就可以使用里面的方法了。
C++
c++本来是在微信读书上看的,实在是看书有点枯燥了,就找了个视频过来看看。看的是腾讯课堂上的职坐标的c++从入门到精通。目前看到了重载操作符。下面来回顾下学习内容。
- 命名空间
如果两个.h中有两个同名同参数的方法,这时候该用哪个呢,命名空间就是为了解决这样的问题
eg. using namespace::std;
- 引用
新增引用 用&修饰的变量即为引用,这在c中是取地址操作符常用于赋值指针,所以说其实引用就类似指针。
引用操作内部变量用. 而指针用->
- 内联函数
其实就是c语言的宏 只不过解决了宏中的二义性和不能访问类中的私有成员
- 默认参数的函数 函数重载 函数模板
默认参数就是在定义函数的时候设置参数默认值会进行自动匹配必须从右往左来着?不记得了那个规则
重载跟java类似
模板就是java中的泛型
- 类 构造函数 析构函数
跟java类似比java多了析构函数需要手动释放占用资源
- 拷贝构造函数和运算符重载operator=
这两个要一起用,什么时候会用到拷贝构造函数
1. 函数传入参数为一个对象的时候即值传递
2. 函数返回值为一个对象
其实不难理解因为函数的执行过程是一个复制的过程,则自然要拷贝,为什么要
用,因为不用就会使上面这两种情况造成回收后有个指针指向不存在的区域。
还有第三种情况
3. 一个对象用于给另一个对象初始化
- 待续
cmakelist
- 待续
makefile
- 待续
jni
- 待续