xiAndroid 下JNI开发1.概述:a)定义:JNI java native interface java本地接口b)作用:实现java和本地代码之间的相互调用c)实际上就是一套协议d)反编译不容易,安全性较高,关键的业务逻辑需要c实现,效率更高2.基本语法:a)头文件i.#include<stdio.h> 标准的输入输出ii.#include<stdlib.h>标准的函数库b)主方法i.Main(){}c)C的基本数据类型i.基本数据类型:1.char 1字节2.Short 2字节3.Int 4字节4.Long 4字节
-
- 5.Float 4字节
-
6.Double 8字节7.Void 1字节ii.基本类型:char int short long float double void (signed unsigned)3.C语言的输入输出函数a)C的输出函数(使用printf()方法打印输出)i.%d : intii.%ld:long intiii.%lld: long longiv.%hd:端整型v.%c: charvi.%f : floatvii.%lf : doubleviii.%u: 无符号数ix.%x : 十六进制输出 (int /long int /short int)x.%o :八进制输出xi.%s : 字符串(使用的是char数组)b)C的输入函数(scanf()方法监听键盘输入的内容)i.语法:scanf(“占位符”,&地址); &:表示取地址符4.C语言的指针(指针就是一个地址,指针里面存放的是地址)a)指针变量:用来存放一个地址到的变量,存放的是某种数据类型数据的地址b)*的三种含义i.表示乘法,如 :i*j;ii.放在数据类型的后面,表示指针变量,用来存放这种数据类型数据的地址,如:int i= 3; int* p ;p可以存放i的地址,即p = &i;iii.*放在指针变量的前面,表示把这个地址中的数据取出来,如:int i=3;int * p =&i; 那么 *p = 3;c)指针常见错误i.声明了但是为赋值 --->野指针ii.指针;类型错误Int* p类型指向double类型的地址5.函数(方法):a)主函数:main(){}b)子函数:子函数必须在主函数之前创建,6.值传递机制:a)值传递;函数内部的使用,直接传递值,不同方法间,值传递传递的是地址(变量的引用);b)引用传递:就是把地址传递过去c)所有的传递其实本质都是值传递,引用传递也是传递的值,不同的是这个值是一个地址7.多级指针a)二级指针变量只能保存一级指针变量的地址b)有几个*就代表是几级指针,int*** p 三级指针c)幻影数据:旧数据,无效数据(在内存中为及时销毁的数据,调用该数据的时候仍然存在)8.数组和指针的关系a)数组的创建int arr[] = {1,2,3,4};注意:[]必须放在数组名之后b)C语言中数据不检查是否索引越界,当索引越界的时候获取的是随机数c)数组占用的内存空间是连续的d)数组变量保存的第0个元素的地址们也就是首地址e)Int数组在内存中的地址,相邻元素相隔4位字节,同理,double数组的相邻元素相隔8位字节,也就是说每个元素占据的内存大小,只跟数组的数据类型有关.f)指针位移一个单位,一个单位是多少个字节没取决于指针的类型g)指针的长度,不管变量的类型是什么,其内存地址的长度一定是相同的h)内存地址不能进行运算9.C语言堆内存和栈内存的简介a)栈内存:(静态内存)i.系统自动分配,系统自动销毁,连续的内存区域,向低地址扩展,大小固定.ii.例如;子函数执行完,子函数中的所有的局部变量都会被销毁,内存释放,但内存地址不会被销毁,只是内存地址上的值被销毁了b)堆内存:(动态内存)i.程序员手动分配(java中:new,C语言中:malloc),控件不连续,大小取决于系统 的虚拟内存,回收:C语言中需要程序员手动回收shifang (free(参数)方法),java中自动回收10.结构体(类似与java中的对象可以用来存储数据)a)结构体的定义b)结构体的使用注意:结构体的属性长度会被自动补齐们这是为了方便指针位移运算c)结构体的函数(类似于java中的方法)i.结构体中不能定义函数,但是可以声明一个函数ii.函数的定义和使用函数的简介程序运行时,函数也保存在内存中,也有一个地址结构体中只可以定义变量,声明函数,不可以定义函数函数指针也是变量,属于指针变量函数指针的定义 返回值类型(*变量名)(参数)函数指针的赋值;函数指针只能指向跟他分返回值和接受参数相同的函数11.联合体(类似java中的泛型,可以表示多种类型)长度等于联合体中定义的变量当中最长的哪个12.枚举(和java中枚举的使用一样)13.类型的定义(自定义类型). %s : 字符串(使用的是char数组)