学习记录:
什么是JNI?
1.Java Native Interface Java本地接口,
2.Java层调用本地C,C++等
3.JNI是Java调用本Native语言的一种特性,与Android无直接关系
4.实际中的驱动都是C/C++开发的,通过JNI,Java可以调用C/C++实现的驱动,从而扩展Java虚拟机的能力。另外,在高效的数学运算、游戏的实时渲染、音视频的编码和解码等方面,一般都是用C开发的。
为什么要有JNI?
Java具备跨平台,面向对象方面的特点,语言特点相对于C更偏向与人的使用和编写,所以相对于C,Java与计算机的交互效率更低,执行效率使用C更好,一些系统相关的操作JVM无法完成,通过JNI条用C等弥补这个缺陷,更完善了Java,故而有JNI。
实现JNI的手段:NDK
1.在Java中声明Native方法(即需要调用的本地方法)
2.编译上述Java源文件(得到.class文件)
3.通过javah命令到户JNI的头文件(.h文件)
4.使用Java需要交互的本地代码,实现在Java中生命的Native方法
5.编译.so库文件
6.通过Java命令执行Java程序,最终实现Java调用本地代码
NDK(NDK(C/C++)SDK(Java)性质是一样的)
1.定义:Native Development Kit,是Android的一个工具开发包
2.作用:快速开发C、C++的动态库、并自动将so和应用一起打包成apk
3.在Android的场景下使用JNI
4.提供了把.so和.apk打包的工具
5.NDK提供的库有限,仅拥有算法效率和敏感的问题
6.提供了交叉编译器,用于生特定的Cpu平台动态库
特点:1.运行效率高 2.代码安全性高 3.功能拓展性好 4.易于代码复用和移植
常用C/C++编译器
clang:是一个C、C++、Object-C的轻量级编译器。基于LLVM(LLVM是以C++编写而成的架构编译器的的框架系统,可以说是一个用于开发编译器相关的库)
gcc:GNU C编译器。原本只能处理C语言,很快扩展,变得可以处理C++。
g++: GNU C++编译器,后缀为.c的源文件,gcc把它当作是C程序,而g++当作是C++程序,后缀为.cppd的,两者都会认为是c++程序,g++会自动链接C++标准库stl,gcc不会,gcc不会定义__cplusplus宏,而g++会
GDB:是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具
C/C++文件编译过程
预处理:预处阶段主要处理include和define等。它把#include包含进来的.h文件插入到#include所在的位置,把源程序中使用到的用#define定义的宏用实际的字符串代替
编译:编译阶段,编译器检查代码的规范性、语法错误等,检查无误后,编译器把代码翻译成汇编语言
汇编:汇编阶段,把.s文件翻译成二进制机器指令文件.o,这个阶段接收.c,.i,.s的文件都没有问题
链接:链接阶段:链接的是其余的函数库,比如我们自己编写的C/C++文件中用到了三方的函数库,在链接阶段就需要链接三方函数库,如果链接不到就会报错
静态库(static library .a)
通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数被称为静态库(static library),通常文件名为"libxxx.a"的形式,Android可以使用静态库。
动态链接库(dynamic link library .so)
对一些函数库的链接载入推迟到程序运行时期(runtime),可以实现进程之间的资源共享,将一些程序升级变得简单,甚至可以真正做到链接载入完全程序员在程序代码中控制。
本地编译
在当前编译平台下,编译出来的程序只能放到当前平台下运行,比如,在x86平台上编写程序并使用工具编译成在x86上可执行程序。这个编译过程称为本地编译。
交叉编译
在当前平台下,编译成其他平台可执行,但自身平台却不能执行,这个编译称为交叉编译
CMAKE手册
https://www.zybuluo.com/khan-lau/note/254724
Makefile 语法详解
https://quanzhuo.github.io/2016/06/06/Makefile/
字长
字长是Cpu的主要技术指标之一,指的是Cpu一次最大能并行处理的二进制位数,现在主流的计算机字长是32位和64位
原码、反码、补码(二进制)
正数:原码、反码、补码均相同
负数:原码(最高为1表示符号为) 反码(原码基础上,符号位不变,其他位取反)补码(反码基础上+1)
如 十进制-2对应的二进制的原码(32位) 1000 0000 0000 0000 0000 0000 0000 0010
反码 1111 1111 1111 1111 1111 1111 1111 1101
补码 1111 1111 1111 1111 1111 1111 1111 1110
计算机通常保存补码
数据类型
字符:char 储值大小:1字节 值范围:-128到127或0到255,1字节8位 ,无符号最小值 0000 0000(十进制=0) 最大值1111 1111 (十进制=255),有符号最大值0111 1111(十进制=127) 最小值1111 1111(十进制=-127),特殊1000 0000(-0) 0000 0000(+0)正负0中正0表示0二进制十进制都吃得消都代表0,没得表示了所以变成了-128(总个数都是256)。程序输出无符号时4294967168是按32位算的值
整形:int 储值大小:2字节或4字节 值范围-32768到32767或-2147483648到2147483647
长整形:long 储值大小:4字节
短整型:short 储值大小:2字节
浮点型:float储值大小:4字节 double储值大小:8字节 long double储值大小:16字节
构造类型
数组 结构体(struct) 共用体(union) 枚举(enum)
指针
void
网友评论