Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий |
Эта глава обсуждает, как JNI отображает типы Java на собственные типы C.
Таблица 3-1 описывает типы примитивов Java и их машинно-зависимые собственные эквиваленты.
Следующее определение обеспечивается для удобства.
jsize
целочисленный тип используется, чтобы описать кардинальные индексы и размеры:
JNI включает много ссылочных типов, которые соответствуют различным видам объектов Java. Ссылочные типы JNI организуются в иерархии, показанной в рисунке 3-1.
В C все другие ссылочные типы JNI определяются, чтобы быть тем же самым как jobject. Например:
В C++ JNI представляет ряд фиктивных классов, чтобы осуществить отношение выделения подтипов. Например:
class _jobject {}; class _jclass : public _jobject {}; ... typedef _jobject *jobject; typedef _jclass *jclass;
Метод и полевые 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 показывает эти подписи типа.
Например, метод Java:
имеет следующую подпись типа:
Использование 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 |
1 | 0 | биты 5-0 |
Байты представляют символ со значением ((x & 0x1f
) << 6
) + (y & 0x3f
).
Символы в диапазоне '\u0800'
к '\uFFFF'
представляются на 3 байта x, y, и z:
x:
1 | 1 | 1 | 0 | биты 15-12 |
1 | 0 | биты 11-6 |
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 |
1 | 0 | 1 | 0 | (биты 20-16) - 1 |
1 | 0 | биты 15-10 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | биты 9-6 |
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.
Содержание | Предыдущий | Следующий |