|
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.
| Содержание | Предыдущий | Следующий |