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

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

基本类型

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

Java类型 JNI类型 C/C++类型 说明
Boolean jboolean unsigned char 无符号,8位
Byte jbyte char 有符号,8位
Char jchar unsigned short 无符号,16位
short jshort short 有符号,16位
Int jint int 有符号,32位
Long jlong long long 有符号,64位
Float jfloat float 32位
Double jdouble double 64位
void void N/A

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

#define JNI_FALSE 0
#define JNI_TRUE 1

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

typedef jint jsize;

引用类型

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

JNI引用类型的组织层次如图所示:
Android Studio3.0开发JNI流程------JNI的类型和数据结构_第1张图片

在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类型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ; 全限定的类
[ type type[]
( 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
感谢博主的辛劳……

你可能感兴趣的:(Android,Studio,Java,jni)