jni开发
什么是jni
java native interface(java本机接口)
为什么要使用jni
需求
特殊设备 机顶盒
执行效率
安全
物联网
怎么使用jni
java基础好
c功底好
c语言编程
java数据类型
byte 1byte
short 2byte
int 4byte
long 8byte
float 4byte
double 8byte
boolean 1byte
char 2byte
c的数据类型
char int float, double, signed, unsigned, long, short and void
进制表示法
c 和 java 都是一样 16进制 0x 8进制 0 十进制
c 字符串
通过字符指针或者字符数组表示 char *str = "大放大"; char str[] = {'','',''};
指针
地址就是指针 指针就是地址
所有类型的指针变量 长度都是4
int *p // 声明指针变量
*p //取指针变量对应的值,取地址上的值
2 * 3 // 做相乘的运算
什么类型的指针 只能指向该类型数据的地址
野指针: 没有给指针变量赋值
定义指针变量也给默认的初始化 0
凡是加了*的指针变量在运行的时候就是去找该指针的内容,这个内容可以是地址也可以是值
Object实例化顺序
1,先为对象属性分配空间,并按属性类型初始化默认值 2,父类属性的初始化 3,父类构造函数的执行 4,子类属性的初始化 5,子类构造函数执行
Java实例化顺序如图:
![]()
方法不能修改实际参数的值,因为方法在内存中是在栈中,栈的意义就是该函数执行完了就退出,那么这个方法里面申明的变量就会被回收,因此也就不能改变传递过来的值,若果传递的是数据的地址,那么方法中就可以获取这个地址然后在根据地址去修改其值.
总结:方法不能改变传递过里的值,但是可以改变传递过来 的地址所指向的值.方法时保存在内存中的栈去,方法执行完就退出了,因此在该方法中申明的变量也会本回收.若是用动态申请的方式为变量赋值,那么该变量是保存在内存中的堆中,堆里面的数据是不会被回收,只有程序调用回收的方法或是垃圾回收器对其回收.,栈的表示:如图![]()
堆的表示:如图1,2
![]()
数组
数组名是表示数组第一个元素地址的常量
指针变量的运算
*p p++ 相当于 p + 1 (1 单位,是指针变量的类型的长度)
*& 相当于不存在 *&i <> i
实际参数 int *p int p[4] 有区别 sizeof(p) 4 sizeof(p) 计算数组占用的内存 16 形式参数 int *p int p[] 没有区别
指针数组与数组指针:
指针数组就是指针的数组,也就是说该数组里面的存放的指针-------->(*p)[2].
数组指针就是数组的指针,就是说每一个指针指向一个数组的首地址--->*p[2],*的运算符低于[],因此对*p不打括号的话p就先和[]中的内容匹配在和*匹配,因此就叫数组指针
字符串
c 字符串是通过字符数组来表示 字符串是以'\0'来表示字符串结束
浅克隆和深克隆
浅克隆是指只克隆出数据的地址,克隆出来的变量依然指向原来的数据,也就是说真实的数据还是只有一份.
深克隆是指先克隆出原数据的地址,再在该地址上克隆出元数据,也就是说数据被真实克隆出来啦,相同的数据在内存中有两份啦.
函数指针:
int mul(int a, int b)
{
return a * b;
}
int (*op)(int,int);//申明一个指针,只不过这个指针后面跟有参数,也可以写成int* op(int,int);
op = mul;//为这个函数指针赋值为mul函数的地址,因为函数名就是函数的地址
int res = (*op)(5,6);//然后根据申明的函数指针传递参数即可调用mul函数.