什么是jni?
- jni : Java native Interface java本地接口,是一个翻译,实现java和本地c/c++语言相互调用
为什么需要jni?
- 1.操作底层硬件,android系统下传感器
- 2.程序运行效率,图形渲染,音视频的解码
- 3.程序数据的安全性,金融相关产品,军工相关产品,关键业务逻辑用本地代码实现
- 4.复用成熟c/c++代码,Sqlite3,OpenGL,OpenSSL,FFmpeg,OpenCV
- 5.复用公司之前产品的c/c++代码
使用jni前提
- 1.熟练使用java
- 2.熟悉c语言
- 3.熟悉jni规范
- 4.学习开发工具NDK
基本数据类型
- 1.c语言中没有java中的boolean和byte,c逻辑真假,非0为真,把其中1代表真值,0为假
- 2.java中char , long比c中类型大
内存的特点
内存最小单元:一个字节byte , 1byte = 8bits 内存的单元排列:一维线性连续 32位cpu,32位操作系统上,每个进程,每个进程拥有4G大小的可用内存范围 存储大小:32根地址线(引脚),对应32位二进制数,产生出2^32不同的数
1byte = 8bits
1K = 1024 bytes 2^10
1M = 1024K = 1024 * 1024 bytes 2^20
1G = 1024M = 1024 * 1024 * 1024 bytes 2^30
4G = 2^32
指针
- 内存单元的地址:每个内存单元的唯一编号
- 在c语言中把内存单元的地址称为指针
指针的作用
- 利用指针访问内存
- //&i
- 取地址运算符 & 获得变量的首地址(编号) *&i
- 取对象运算符 * 根据内存地址取内存中数据
指针变量
-
变量按功能分两类:普通变量,保存数值数据;指针变量,保存变量的地址(内存单元的编号)
- 普通变量定义:数据类型 变量名; int i; char a = ‘i’;
- 指针变量定义:数据类型 *指针变量名; *是类型标志 int *p;
含义
- 两个运算数:乘法 a * b
- 定义指针变量:指针类型标志 char *p;
- 除了定义指针变量之外:取对象运算符 *p 根据p保存地址,取对应内存单元的内容
指针
- 把变量的地址,指针变量通称为指针
指针的指向
- 指针变量保存一个对应类型变量的地址,指针变量指向这个变量,指向这个变量可以通指针运算符访问变量
指针相关的类型
- 指针的数据类型:int 是指针指向对象类型,决定指针变量利用取对象运算符访问内存时一次访问几个字节
- 指针类型:int * 指针类型
指针使用时的错误
-
1.指针类型不匹配
int a = 100; char *p; int *pa; p = &a;//指针类型不匹配,访问内存方式不同
-
2.野指针:指针没有合法的指向,建议给NULL,读写一定报错,必须先获得合法指向才能使用
int a = 0;
int *p = &a;//在栈变量未赋初值,初值不能确定
int *r;//野指针 指针没有合法的指向
int *q = NULL;//NULL读写一定报错,必须先获得合法指向才能使用
*p = 100;
*q = 100;
二级指针
-
int i = 10; 变量名i访问其申请的内存 普通变量:保存数值数据
-
int *p = &i;
指针变量p指向变量i*p <=> i
一级指针变量:保存普通变量地址 -
int * *pp = &p;
二级指针变量:保存一级指针变量的地址*pp <=> p
**pp <=> *p <=> i
指针的运算
- 指针ptr加整数N
ptr + N * sizeof
(对象类型) ptr向高地址方向移动N个对象 - 指针ptr减整数N
ptr - N * sizeof
(对象类型) ptr向低地址方向移动N个对象
数组
- 相同数据类型变量的集合,变量在内存中连续
怎样定义数组
//数据类型 数组名[数组元素个数常量];
int arr[6];// arr[0] arr[1] arr[2] ~ arr[5]
数组的特点
- 1.数组名代表数组首元素首地址 arr 代表 &arr[0]
- 2.数组定义要求个数确定,个数需要是常量,
- 3.c语言不检查数组下标越界
- 4.计算数组元素个数:sizeof(arr) / sizeof(arr[0])