在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下本身的学习经验。 c++
JNI是Java代码和C/C++代码通讯的桥梁,其角色在某种意义上就是一个翻译员,从设计模式来看叫适配器。 算法
二者的沟通,首要的必定要对嘴型,对channel,沟通才能到位。计算机程序的基本组成,从狭义来说,就是数据结构+算法。因为Java和C/C++是两种不一样的编程语言,它们各自拥有自家定义的数据类型和结构。JNI的第一步就是统一转换其中一方的数据类型,这就比如咱们跟外国友人沟通,咱们得说英语同样子。下表是Java的8大基本类型,在Jni层对应的数据描述: 编程
Java | Native(jni.h) |
boolean | jboolean |
byte | jbyte |
char | jchar |
short | jshort |
int | jint |
long | jlong |
float | jfloat |
double | jdouble |
复杂一点的对象类型,其对应的数据描述以下图: 设计模式
这里补充说明一下: 数组
关于数据类型的转换,JNI还提供的强悍的函数库来支持。对于基本的类型的转换,咱们先来复习一下,先关注一下Java基本类型的精度。 数据结构
类型 | 字节数 | 范围/精度 |
float | 4 | 32位IEEE754单精度 |
double | 8 | 64位IEEE754双精度 |
byte | 1 | -128到127 |
short | 2 | -32,768到32,767 |
int | 4 | -2,147,483,648到2,147,483,647 |
long | 8 | -9,223,372,036,854,775,808到9,223,372,036,854,775,807 |
char | 2 | 整个Unicode字符集 |
boolean | 1 | True或者false |
Java 的基本数据类型是不存在有符号和无符号这种概念的,它们的取值范围是固定的,不会随着机器硬件环境或者操做系统的改变而改变。 编程语言
像 byte 的范围是 -128 到 127,你想要变为 0到255 怎么办,,跟 0XFF 作与运算就能够了:b & 0XFF 函数
如 byte b ,若是你想赋值它值 255,那是不行的, 就算赋值了,b的值也是 255 对 256 求模后的值 -1,即 b = -1, 而后 b & 0XFF 结果即为 255,这个与运算后的结果会隐式转换为int 类型的, 由于 byte 放不下了,与运算仍是很快的,,比加减法还快的。 学习
因此Jni层使用Java的基本类型数据,对于上面八种基本的数据类型,jni层的c/c++代码能够用强制直接转换成对应长度的c/c++类型数据。 spa
如:unsigned char tmp = (unsigned char) m_jboolean;
unsigned short tmp = (unsigned short) m_jchar;
或者同长度类型的数据,能够直接赋值,int tmp = m_jint;
关于Jni操做对象类型或更复杂数据类型的说明,请留意以后的博客。
本文转自Zhiweiofli's Blog,转载请注明出处,谢谢。