JNI 의 형태와 데이터 구조 - xrath.com 에서 번역됨

목차 | 전의 항목 | 다음의 항목 | Java Native Interface 스펙

## JNI 의 형태와 데이터 구조

## 제 3 장

이 장에서는, JNI 가 어떻게 Java 의 형태를 네이티브 C 의 형태에 매핑 하는지를 해설합니다.

## 원시형

겉(표) 3-1 는, Java 의 원시형 및 그러한 머신 의존의 네이티브형과의 대응에 대해 설명하고 있습니다.

겉(표) 3-1 원시형과 네이티브형
Java 의 데이터형 | 네이티브형 | 설명
--- | --- | ---
boolean | jboolean | unsigned 8 비트
byte | jbyte | signed 8 비트
char | jchar | unsigned 16 비트
short | jshort | signed 16 비트
int | jint | signed 32 비트
long | jlong | signed 64 비트
float | jfloat | 32 비트
double | jdouble | 64 비트
void | void | 없음

다음의 정의는, 편리성이기 때문에 제공되고 있습니다.

    #define JNI_FALSE  0
    #define JNI_TRUE   1

`jsize` 정수형은, 기본적인 첨자 및 사이즈를 기술하기 위해서 사용됩니다.

    typedef jint jsize;

## 참조형

JNI 에는, 각종의 Java 객체에 대응하는 많은 참조형이 포함되어 있습니다. JNI 참조형은,그림 3-1 에 나타내도록(듯이), 계층 구조가 되어 있습니다.

그림 3-1 참조형의 계층

C 에서는, 그 외 모든 JNI 참조형은, jobject 와 같이 정의되고 있습니다. 예를 나타냅니다.

    typedef jobject jclass;

C++ 에서는, JNI 는 더미 클래스세트를 도입해, subtype 관계를 강제합니다. 예를 나타냅니다.

    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 는, Java VM 의 형태의 시그니챠 표현을 사용합니다. 겉(표) 3-2 는, 이러한 형태의 시그니챠를 나타내고 있습니다.

겉(표) 3-2 Java VM 의 형태의 시그니챠
Type Signature | 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 VM 에 의해 사용되는 것 것과 같습니다. 변경 후의 UTF-8 캐릭터 라인은, 1 문자에 대해 1 바이트만을 사용해 null 이외의 ASCII 문자만이 포함되는 문자 순서를 표현할 수 있도록(듯이) 코드화 되고 있습니다만, Unicode 문자도 모두 표현할 수 있습니다.

다음과 같이, \u0001? \u007F 의 모든 문자가 1 바이트로 표현됩니다.

0 | bits 6-0

바이트중 7 비트의 데이터는, 표현되고 있는 문자의 값을 나타냅니다.

null 문자 (`「\u000」`) 및 `「\u0080」? 「\u07FF」` 의 모든 문자는, 다음과 같이 x 와 y 의 한 벌의 바이트로 표현됩니다.

x:

1 | 1 | 0 | bits 10-6

y:

1 | 0 | bits 5-0

이 바이트는, ((x & `0x1f`) << `6`) + (y & `0x3f`)의 값으로 문자를 표현합니다.

`「\u0800」`? `「\uFFFF」` 의 문자는, 다음과 같이 x, y 및 z 의 3 바이트로 표현됩니다.

x:

1 | 1 | 1 | 0 | bits 15-12

y:

1 | 0 | bits 11-6

z:

1 | 0 | bits 5-0

((x & `0xf`) << `12`) + ((y & `0x3f`) <<`6`) + (z & `0x3f`)라고 하는 값의 문자가 바이트로 표현됩니다.

U+FFFF 보다 큰 코드 포인트를 가지는 문자 (이른바 「보조 문자」)는, UTF-16 표현의 2살의 대리 코드 단위를 따로 따로 encode 하는 것으로 표현됩니다. 대리 코드 단위는 각각 3 바이트로 표현됩니다. 즉, 보조 문자는,u,v,w,x,y,z 의 6 바이트로 표현됩니다.

u:

1 | 1 | 1 | 0 | 1 | 1 | 0 | 1

v:

1 | 0 | 1 | 0 | (bits 20-16) - 1

w:

1 | 0 | bits 15-10

x:

1 | 1 | 1 | 0 | 1 | 1 | 0 | 1

y:

1 | 0 | 1 | 1 | bits 9-6

z:

1 | 0 | bits 5-0

값이 0x10000+((v&0x0f) <<16)+((w&0x3f) <<10)+(y&0x0f) <<6)+(z&0x3f)의 문자는 6 바이트로 표현됩니다.

멀티 바이트 문자의 바이트는,`class` 파일에 빅 endian순서 (고위 바이트가 앞)에 포함되고 있습니다.

이 형식과 표준 UTF-8 형식과는, 2 개의 차이점이 있습니다. 제일은, null 문자 `(char) 0` 이, 1 바이트 형식이 아니고 2 바이트 형식에서 코드화 되고 있는 것입니다. 이것은, 변경 후의 UTF-8 캐릭터 라인에 null 가 짜넣어지지 않은 것을 의미합니다. 제니는, 표준 UTF-8 의 1 바이트, 2 바이트, 및 3 바이트 형식만이 사용되고 있는 것입니다. Java VM 는, 표준 UTF-8 의 4 바이트 형식을 인식하지 않고, 2 x 3 바이트 형식을 사용합니다.

표준 UTF-8 형식에 관한 자세한 것은, 「The Unicode Standard, Version 4.0」의 「3.9 Unicode Encoding Forms」를 참조해 주세요.

목차 | 전의 항목 | 다음의 항목 |

Copyright © 2003 Sun Microsystems, Inc. All rights reserved.