JNI Types and Data Structures
来源:互联网 发布:纯软件语音室 编辑:程序博客网 时间:2024/05/22 12:53
转自https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html
Chapter 3: JNI Types and Data Structures
This chapter discusses how the JNI maps Java types to native C types.
This chapter covers the following topics:
- Primitive Types
- Reference Types
- Field and Method IDs
- The Value Type
- Type Signatures
- Modified UTF-8 Strings
Primitive Types
The following table describes Java primitive types and their machine-dependent native equivalents.
The following definition is provided for convenience.
#define JNI_FALSE 0#define JNI_TRUE 1
The jsize
integer type is used to describe cardinal indices and sizes:
typedef jint jsize;
Reference Types
The JNI includes a number of reference types that correspond to different kinds of Java objects. JNI reference types are organized in the following hierarchy:
- jobject
jclass
(java.lang.Class
objects)jstring
(java.lang.String
objects)jarray
(arrays)jobjectArray
(object arrays)jbooleanArray
(boolean
arrays)jbyteArray
(byte
arrays)jcharArray
(char
arrays)jshortArray
(short
arrays)jintArray
(int
arrays)jlongArray
(long
arrays)jfloatArray
(float
arrays)jdoubleArray
(double
arrays)
jthrowable
(java.lang.Throwable
objects)
In C, all other JNI reference types are defined to be the same as jobject. For example:
typedef jobject jclass;
In C++, JNI introduces a set of dummy classes to enforce the subtyping relationship. For example:
class _jobject {};class _jclass : public _jobject {};// ...typedef _jobject *jobject;typedef _jclass *jclass;
Field and Method IDs
Method and field IDs are regular C pointer types:
struct _jfieldID; /* opaque structure */typedef struct _jfieldID *jfieldID; /* field IDs */struct _jmethodID; /* opaque structure */typedef struct _jmethodID *jmethodID; /* method IDs */
The Value Type
The jvalue
union type is used as the element type in argument arrays. It is declared as follows:
typedef union jvalue { jboolean z; jbyte b; jchar c; jshort s; jint i; jlong j; jfloat f; jdouble d; jobject l;} jvalue;
Type Signatures
The JNI uses the Java VM’s representation of type signatures. The following table shows these type signatures.
For example, the Java method:
long f (int n, String s, int[] arr);
has the following type signature:
(ILjava/lang/String;[I)J
Modified UTF-8 Strings
The JNI uses modified UTF-8 strings to represent various string types. Modified UTF-8 strings are the same as those used by the Java VM. Modified UTF-8 strings are encoded so that character sequences that contain only non-null ASCII characters can be represented using only one byte per character, but all Unicode characters can be represented.
All characters in the range \u0001 to \u007F are represented by a single byte, as follows:
0xxxxxxx
The seven bits of data in the byte give the value of the character represented.
The null character ('\u0000'
) and characters in the range '\u0080'
to '\u07FF'
are represented by a pair of bytes x and y:
- x:
110xxxxx
- y:
10yyyyyy
The bytes represent the character with the value ((x & 0x1f
) << 6
) + (y & 0x3f
).
Characters in the range '\u0800'
to '\uFFFF'
are represented by 3 bytes x, y, and z:
- x:
1110xxxx
- y:
10yyyyyy
- z:
10zzzzzz
The character with the value ((x & 0xf
) << 12
) + ((y & 0x3f
) << 6
) + (z & 0x3f
) is represented by the bytes.
Characters with code points above U+FFFF (so-called supplementary characters) are represented by separately encoding the two surrogate code units of their UTF-16 representation. Each of the surrogate code units is represented by three bytes. This means, supplementary characters are represented by six bytes, u, v, w, x, y, and z:
- u:
11101101
- v:
1010vvvv
- w:
10wwwwww
- x:
11101101
- y:
1011yyyy
- z:
10zzzzzz
The character with the value 0x10000+((v&0x0f)<<16)+((w&0x3f)<<10)+(y&0x0f)<<6)+(z&0x3f) is represented by the six bytes.
The bytes of multibyte characters are stored in the class
file in big-endian (high byte first) order.
There are two differences between this format and the standard UTF-8 format. First, the null character (char)0
is encoded using the two-byte format rather than the one-byte format. This means that modified UTF-8 strings never have embedded nulls. Second, only the one-byte, two-byte, and three-byte formats of standard UTF-8 are used. The Java VM does not recognize the four-byte format of standard UTF-8; it uses its own two-times-three-byte format instead.
For more information regarding the standard UTF-8 format, see section 3.9 Unicode Encoding Forms of The Unicode Standard, Version 4.0.
- JNI Types and Data Structures
- JNI Types and Data Structures
- [Android JNI] JNI Types and Data Structures
- JNI Types and Data Structures----JAVA和C语言 c++之间转换的对照表
- Data Types and Data Structures (数据类型和数据结构)
- java-jni-03-JNI Types and Data Structure
- Data Structures and Algorithms
- Data Structures and Algorithms
- Objects and Data Structures
- Oracle data types and Microsoft SQL Server data types
- Data Structures and Algorithms in Java
- Algorithms.and.Data.Structures算法与数据结构
- Algorithms and Data Structures: The Basic Toolbox
- Data Structures and Algorithms in Java
- DATA STRUCTURES AND ALGORITHMS USING C#.
- Data Structures and Algorithm面试笔试题
- Data Structures and Algorithm Analysis in Java_IntroductionTest
- #学习笔记#Princeton Algorithms and Data Structures
- Djando安装配置
- Python Exception 错误信息输出机理
- 随便写写的java笔记10
- samba不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接
- 编译goldfish2.6.9遇见的问题
- JNI Types and Data Structures
- 从mykernel分析linux任务调度
- 多态
- [51Nod 1224] 阶乘的幂的倍数
- Flex 实现动态加载图片
- 一个LRUMap的实现——来自apache common-collections框架
- 关于数组名的思考和验证
- BZOJ 1187 HNOI 2007 神奇游乐园 插头DP
- linux服务器集群部署:之nginx配置