Android Studio3.0开发JNI流程------JNI的类型和数据结构

12 篇文章 0 订阅
9 篇文章 0 订阅

JNI如何将Java类型映射到本地C类型

基本类型

基本类型和本地等效类型表:

Java类型JNI类型C/C++类型说明
Booleanjbooleanunsigned char无符号,8位
Bytejbytechar有符号,8位
Charjcharunsigned short无符号,16位
shortjshortshort有符号,16位
Intjintint有符号,32位
Longjlonglong long有符号,64位
Floatjfloatfloat32位
Doublejdoubledouble64位
voidvoidN/A

为了使用方便,特提供以下定义:

#define JNI_FALSE 0
#define JNI_TRUE 1

jsize整数类型用于描述主要指数和大小:

typedef jint jsize;

引用类型

JNI包含了很多对应于不同Java对象的引用类型。

JNI引用类型的组织层次如图所示:
这里写图片描述

在C中,所有其它JNI引用类型都被定义为与jobject一样。例如:

typedef jobject jclass;

在C++中,JNI引入了虚构类以加强子类关系。例如:

class _jobject {};
class _jclass : public _jobject {};
...
typedef _jobject *jobject;
typedef _jclass *jclass;

域ID和方法ID

方法ID和域ID是常规的C指针类型:

struct _jfieldID;  /*不透明结构 */
typedef struct _jfieldID *jfieldID;  /* 域 ID */
struct _jmethodID;  /* 不透明结构 */
typedef struct _jmethodID *jmethodID; /* 方法 ID */

值类型

jvalue联合类型在参数数组中用作单元类型。其声明方式如下:

typedef union jvalue {
    jboolean z;
    jbyte    b;
    jchar    c;
    jshort   s;
    jint     i;
    jlong    j;
    jfloat   f;
    jdouble  d;
    jobject  l;
} jvalue;

类型签名

JNI使用Java虚拟机的类型签名表述。下表列出了这些类型签名:

类型签名Java类型
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
L fully-qualified-class ;全限定的类
[ typetype[]
( arg-types ) ret-type方法类型

例如,Java方法:

long f (int n, String s, int[] arr);

具有以下类型签名:

(ILjava/lang/String;[I)J

UTF-8字符串

JNI用UTF-8字符串来表示各种字符串类型。UTF-8字符串和Java虚拟机所使用的一样。UTF-8字符串的编码方式使得仅包含非空ASCII字符的字符序列能够按每字符一个字节表示,但是最多只能表示16位的字符。所有在\u0001到\u007F范围内的字符都用单字节表示,如下所示:

| 0 | 0-6位 |

字节中的七位数据确定了所表示字符的值。空字符 (\u000)\u0080到\u07FF范围内的字符用一对字节表示, 即x和y,如下所示:

x:| 1 | 1 | 0 | 6-10位 |
y:| 1 | 0 | 0-5位 |

值为((x&0x1f)<<6)+(y&0x3f)的字符需用两个字节表示。\u0800到\uFFFF范围内的字符用三个字节表示,即x,y和z:

x:| 1 | 1 | 1 | 0 | 12-15位 |
y:| 1 | 0 | 6-11位 |
z:| 1 | 0 | 0-5位 |

值为((x&0xf)<<12)+(y&0x3f)<<6)+(z&0x3f)的字符需用三个字节表示。

此格式与“标准” UTF-8格式之间有两个区别。第一,空字节(byte)0使用双字节格式进行编码,而不是单字节格式。这意味着Java虚拟机的UTF-8字符串不可能有嵌入的空值。第二,只使用单字节、双字节和三字节格式。Java虚拟机不能识别更长的UTF-8格式。

本文内容主要参考
http://blog.csdn.net/qinjuning/article/details/7599796
http://blog.csdn.net/yanbober/article/details/45310365
感谢博主的辛劳……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值