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 문자만이 포함되는 문자 순서를 표현할 수 있도록(듯이) 코드화 되고 있어 16 비트까지의 문자를 표현 슬슬 일이 생깁니다. 다음과 같이,`\u0001`? `\u007F` 의 범위의 모든 문자가 1 바이트로 표현됩니다.

바이트중 7 비트의 데이터는, 표현되고 있는 문자의 값을 나타냅니다. null 문자 (`\u000`) 및 `\u0080? \u07FF` 의 범위의 모든 문자는, 다음과 같이 x 와 y 의 한 벌의 바이트로 표현됩니다.

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

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

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

이 형식과 「표준」UTF-8 형식과는, 2 개의 차이점이 있습니다. 제일은, null 바이트 `(byte) 0` 이, 1 바이트 형식이 아니고 2 바이트 형식에서 코드화 되고 있는 것입니다. 이것은 Java VM UTF-8 캐릭터 라인이 null 를 짜넣는 것이 없는 것을 의미합니다. 제니는, 1 바이트, 2 바이트, 및 3 바이트 형식만이 사용되고 있는 것입니다. Java VM 는 이것보다 긴 UTF-8 형식을 인식하지 않습니다.

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

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