在前面的一篇博客《Android NDK开发简介》,我简单地说明了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 |
复杂一点的对象类型,其对应的数据描述如下图:
这里补充说明一下:
- Java中的返回值void和JNI中的void是完全对应的
- Java中的基本数据类型(boolean, byte, char, short, int, long, float, double),在JNI中对应的数据类型只要在前面加上 j 就对应了(jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble)
- Java中的对象,包括类库中定义的类、接口以及自定义的类接口,都对应于JNI中的 jobject
- Java中基本数据类型的数组对应与JNI中的 jarray 类型。(type就是上面说的8种基本数据类型)
- 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操作对象类型或更复杂数据类型的说明,请留意之后的博客。
本文转自Zhiweiofli's Blog,转载请注明出处,谢谢。
相关推荐
jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....
本例演示了最常用的字符、数值、字符数组、数值数组等在free pascal和android虚拟机之间的互相传递。 代码包括这些数据类型转换示例。
1.1.5 在Windows平台上下载并安装AndroidNDK 1.1.6 在Windows平台上下载并安装Eclipse 1.2 AppleMacOSX 1.2.1 在Mac平台上安装Xcode 1.2.2 验证Mac平台的Java开发包 1.2.3 验证Mac平台上的ApacheANT 1.2.4 验证GNU...
1、JNI文件读写操作2、JNI数据类型转换处理3、JNI文件内容加解密处理4、JNI动态注册、动态调试5、反编译SO文件、SO安全加固策略适合人群:1、有一定Android基础,零JNI基础的学员;2、接触过JNI,但却不甚了解的学员...
Ndk学习对应jni的数据类型实际调用和签名解说、cmake的用法,环境配置
14.3 JNI的数据类型和类型签名 484 14.4 JNI调用Java方法的流程 486 第15章 Android性能优化 489 15.1 Android的性能优化方法 490 15.1.1 布局优化 490 15.1.2 绘制优化 493 15.1.3 内存泄露优化 493 15.1.4 ...
Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...
7、实例七:jni函数中传递基本数据类型参数... 62 8、实例八:在jni函数中传递对象类型参数... 62 9、实例九:在jni函数中处理字符串... 63 10、实例十:在jni函数中处理数组... 64 11、实例十一:在jni中的...
14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存...
/ 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型...
内容涵盖绝大部分Android程序员需要的技能:「数据结构算法」「程序架构」「设计模式」「性能优化」「组件化」「插件化」「热修复」「 NDK技术」「自定义检视」「性能优化」「 Android原始分析」「深入理解Kotlin 」...
//----字符串处理 (java中编码为utf-16,android为utf-8),jni不能直接使用string---- private native String passStringReturnString(String string); //--基本类型--- private native int add(int a, ...
android serial串口通讯 设置串口数据位,校验位, 速率,停止位、校验类型,
对于谁好谁坏,我们这里不去评价,如果要使用Chipmunk作为物理引擎会比Box2d稍微苦难一些,因为Chipmunk目前没有Java版本,所以只能通过JNI方式来使用,这就需要使用NDK来开发原生的C程序,使用C语言来做,效率要高...