Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации
Содержание | Предыдущий | Следующий

Типы JNI и Структуры данных


 Глава 3

Эта глава обсуждает, как JNI отображает типы Java на собственные типы C.

Типы примитивов

 Таблица 3-1 описывает типы примитивов Java и их машинно-зависимые собственные эквиваленты.

 Табличные 3-1 Типы примитивов и Собственные Эквиваленты
Тип Java
Собственный Тип
Описание
булев
jboolean
8 битов без знака
байт
jbyte
подписанные 8 битов
случайная работа
jchar
16 битов без знака
короткий
jshort
подписанные 16 битов
интервал
jint
подписанные 32 бита
долго
jlong
подписанные 64 бита
плавание
jfloat
32 бита
двойной
jdouble
64 бита
пусто
пусто
N/A

Следующее определение обеспечивается для удобства.

#define JNI_FALSE  0 
#define JNI_TRUE   1 

jsize целочисленный тип используется, чтобы описать кардинальные индексы и размеры:

typedef jint jsize; 

Ссылочные типы

JNI включает много ссылочных типов, которые соответствуют различным видам объектов Java. Ссылочные типы JNI организуются в иерархии, показанной в  рисунке 3-1.

Вершина heirarchy является jobject. Подклассы jobject являются jclass, jstring, jarray и jthrowable. Подклассы jarray являются jobjectArray, jbooleanArray, jbyteArray, jcharArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray.

 Иерархия Ссылочного типа рисунка 3-1

В C все другие ссылочные типы JNI определяются, чтобы быть тем же самым как jobject. Например:

typedef jobject jclass; 

В C++ JNI представляет ряд фиктивных классов, чтобы осуществить отношение выделения подтипов. Например:

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

Поле и ID Метода

Метод и полевые ID являются регулярными типами указателей C:

struct _jfieldID;              /* opaque structure */ 
typedef struct _jfieldID *jfieldID;   /* field IDs */ 
 
struct _jmethodID;              /* opaque structure */ 
typedef struct _jmethodID *jmethodID; /* method IDs */ 

Тип Значения

jvalue тип объединения используется, поскольку элемент вводит массивы параметра. Это объявляется следующим образом:

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

Введите Подписи

JNI использует представление VM’s Java подписей типа.  Таблица 3-2 показывает эти подписи типа.

 Табличный 3-2 Java Подписи Типа VM
Введите Подпись
Тип Java
Z
булев
B
байт
C
случайная работа
S
короткий
Я
интервал
J
долго
F
плавание
D
двойной
L fully-qualified-class;
fully-qualified-class
[введите
введите []
(типы аргумента) мочить-тип
тип метода

Например, метод Java:

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

имеет следующую подпись типа:

(ILjava/lang/String;[I)J 

Измененные Строки UTF-8

Использование JNI измененный UTF-8 представляет в виде строки, чтобы представить различные строковые типы. Измененные строки UTF-8 являются тем же самым как используемыми Java VM. Измененные строки UTF-8 кодируются так, чтобы символьные последовательности, которые содержат только ненулевые символы ASCII, могли быть представлены, используя только один байт за символ, но все символы Unicode могут быть представлены.

Все символы в диапазоне \u0001 к \u007F представляются единственным байтом, следующим образом:

0 биты 6-0

Семь битов данных в байте дают значение представленного символа.

Нулевой символ ('\u0000') и символы в диапазоне '\u0080' к '\u07FF' представляются парой байтов x и y:

x:

1 1 0 биты 10-6
y:
1 0 биты 5-0

Байты представляют символ со значением ((x & 0x1f) << 6) + (y & 0x3f).

Символы в диапазоне '\u0800' к '\uFFFF' представляются на 3 байта x, y, и z:

x:

1 1 1 0 биты 15-12
y:
1 0 биты 11-6
z:
1 0 биты 5-0

Символ со значением ((x & 0xf) << 12) + ((y & 0x3f) << 6) + (z & 0x3f) представляется байтами.

Символы с кодовыми точками выше U+FFFF (так называемые дополнительные символы) представляются, отдельно кодируя два суррогатных элемента кода их представления UTF-16. Каждый из суррогатных элементов кода представляется на три байта. Это означает, дополнительные символы представляются на шесть байтов, u, v, w, x, y, и z:

u:

1 1 1 0 1 1 0 1
v:
1 0 1 0 (биты 20-16) - 1
w:
1 0 биты 15-10
x:
1 1 1 0 1 1 0 1
y:
1 0 1 1 биты 9-6
z:
1 0 биты 5-0

Символ со значением 0x10000 + (v&0x0f) <<16) + ((w&0x3f) <<10) + (y&0x0f) <<6), + (z&0x3f) представляется на шесть байтов.

Байты многобайтовых символов сохранены в class файл в обратном порядке байтов (высокий байт сначала) порядок.

Есть два различия между этим форматом и стандартным форматом UTF-8. Во-первых, нулевой символ (char)0 кодируется, используя двухбайтовый формат, а не однобайтовый формат. Это означает, что измененные строки UTF-8 никогда не встраивали, обнуляет. Во-вторых, только однобайтовое, два байта, и трехбайтовые форматы стандартного UTF-8 используются. Java VM не распознает четырехбайтовый формат стандартного UTF-8; это использует свой собственный формат "два раза три байта" вместо этого.

Для получения дополнительной информации относительно стандартного формата UTF-8, см. раздел 3.9 Формы Кодирования Unicode Стандарта Unicode, Версии 4.0.

 


Содержание | Предыдущий | Следующий

Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами