什么是JNI
java native interface(java本地接口)ABI: application binary interface (应用程序二进制接口)
为什么要使用JNI
* 复用很多优秀的c/c++代码- ffmpeg 多媒体播放器- opencv 图形识别引擎- 7-zip 压缩- opencore 视频播放* 效率问题- java代码跨平台,不直接操作硬件,虚拟机解释执行。垃圾回收机制。- art 在安装apk应用程序的时候,把apk里面的dex翻译成机器码(apk的体积会变大)- c代码直接操作硬件,程序员可以手工的释放内存* 应用场景问题- c代码可以直接操作硬件。- java代码只能操作虚拟机(一次编译到处执行)- 智能家居操作硬件- 车载电脑(obd: onboard debug system)* 特殊业务逻辑- c代码反编译困难,调试困难。- java代码反编译容易,很容易看懂。
怎么使用JNI
* 看懂c代码( 有c语言基础)* 懂流程 (熟悉jni的规范)* 熟练(NDK 工具 native develop kits)
#开发工具
dev-cpp.exe1. 轻量级开发工具2. 编译器gcc c99标准
c语言helloworld
1.声明头文件,相当于java的导包。#include <stdio.h>2.写main()方法main(){}3.为了观察程序执行的结果,需要调用windows系统的一个指令system("pause");
C语言的基本数据类型
* java语言的8大基本类型- int 4byte 32位- byte 1byte 8位- short 2byte 16位- long 8byte 64位- float 4byte 32位- double 8byte 64位- boolean 1byte 8位- char 2byte 16位* c语言的基本数据类型sizeof();获取一个数据类型的长度- char 1byte 8位 和java不同- long 4byte 32位和java不同- int 4byte 32位 和java一致- float 4byte 32位 和java一致- double 8byte 64位和java一致- short 2byte 16位 还可以表示java里面的char- 在c语言里面没有boolean类型,0假 非0真- 在c语言里面没有byte类型 可以用char表示byte类型。* 修饰符的作用- signed 有符号- unsigned 无符号> 1000 0000(负0) -> 0111 1111+1(取反加1 ) = 1000 0000(负128)> 缓冲区溢出漏洞。本质原因就是c语言不检查数组下标。不检查内存空间的越界##指针指针就是 一块内存空间(内存地址)* window 32位系统 寻址空间32位最多能表示出来4G内存地址的组合。计算机有一些硬件设备需要占用一些内存地址。留给用户的可用空间 不足3个G* window 64位系统 寻址空间是64位
号的含义
* 如果跟着一种数据类型的后面int* 代表是一种指针变量, 存放的是一个内存地址。* 如果*号放在一个指针变量的前面,代表的是取地址里面数据的操作 *p 把p地址里面存放的数据取出来* x*y 相乘
指针变量和指针的概念
看世面上书的时候 指针变量和指针没什么区别指针变量: 一个变量 int* p; p是指针变量指针: 一块内存空间的地址
值传递和引用传递
* 准确讲只有值传递。调用子函数所有的操作,都是值传递。引用传递,还是值传递,传递是对象的地址
所有程序执行的内存分配的特点。
子函数一旦执行完毕后,内存空间会被系统回收。