博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android NDK开发之Jni的数据类型
阅读量:6279 次
发布时间:2019-06-22

本文共 1683 字,大约阅读时间需要 5 分钟。

hot3.png

在前面的一篇博客《》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。

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

复杂一点的对象类型,其对应的数据描述如下图:

这里补充说明一下:

  1. Java中的返回值void和JNI中的void是完全对应的 
  2. Java中的基本数据类型(boolean, byte, char, short, int, long, float, double),在JNI中对应的数据类型只要在前面加上 j 就对应了(jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble) 
  3.  Java中的对象,包括类库中定义的类、接口以及自定义的类接口,都对应于JNI中的 jobject
  4.  Java中基本数据类型的数组对应与JNI中的 jarray 类型。(type就是上面说的8种基本数据类型)
  5.  Java中对象的数组对应于JNI中的 jobjectArray 类型。(在Java中一切对象、接口以及数组都是对象)

关于数据类型的转换,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++类型数据。

如:unsigned char tmp = (unsigned char) m_jboolean;        

     unsigned short tmp = (unsigned short) m_jchar;        

或者同长度类型的数据,可以直接赋值,int tmp = m_jint;

关于Jni操作对象类型或更复杂数据类型的说明,请留意之后的博客。

本文转自,转载请注明出处,谢谢。

转载于:https://my.oschina.net/zhiweiofli/blog/114062

你可能感兴趣的文章
iOS开发-CocoaPods实战
查看>>
JS组件系列——Bootstrap 树控件使用经验分享
查看>>
HTML-color:rgb()-颜色渐进
查看>>
数据库实例: STOREBOOK > 表空间 > 编辑 表空间: UNDOTBS1
查看>>
Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)...
查看>>
Javascript防冒泡事件与Event对象
查看>>
managed domain与unmanaged domain
查看>>
《中国人工智能学会通讯》——11.47 领域文本中的实体链接技术
查看>>
刚毕业不久,就在人工智能上做出这样大贡献
查看>>
中国人工智能学会通讯——迎接深度学习的“大”挑战(下) 1.2 深度学习的挑战和机遇...
查看>>
不可不看!即将发布的浪潮高端存储
查看>>
锐捷工程师:深夜敲击键盘的样子,很燃
查看>>
数据中心未来的商业化系统
查看>>
《算法技术手册》一2.3 最好、最坏和平均情况下的性能分析
查看>>
LTE-Hi渐行渐近 有望打破4G深度覆盖局限
查看>>
Nuance报告:医护人员如何从人工智能中受益
查看>>
JavaScript异步与Promise实现
查看>>
Android内存泄漏产生的6大原因
查看>>
F5 Networks任命Adam Judd领导亚太区销售工作 将加速区域云和安全业务发展
查看>>
将给企业带来巨大转变的八项“变革式”技术趋势
查看>>