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引用类型的组织层次如图所示:
在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
感谢博主的辛劳……