什么是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;

含义

  1. 两个运算数:乘法 a * b
  2. 定义指针变量:指针类型标志 char *p;
  3. 除了定义指针变量之外:取对象运算符 *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])