안녕하세요 돼지왕 왕돼지입니다.
이 글은 Oracle 에서 제공하는 Tutorial 문서를 번역한 것입니다.
출처 : http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp9502
오늘은 JNI 의 Type 과 Data Structure에 대해 한번 알아볼까요?
JNI Types and Data Structures
이 장에서는 JNI 가 어떻게 Java type 과 native C type 을 매핑하는지에 대해 알아봅니다.
Primitive Types
다음 테이블은 Java primitive 와 machine-dependent 한 native 적 특정을 묘사합니다.
Java Type | Native Type | Description |
boolean | jboolean | unsigned 8bits |
byte | jbyte | signed 8bits |
char | jchar | unsigned 16bits |
shrot | jshort | signed 16bits |
int | jint | signed 32bits |
long | jlong | signed 64bits |
float | jfloat | 32bits |
double | jdouble | 64bits |
void | void | N/A |
다음 정의는 편리함을 제공합니다.
#define JNI_FALSE 0
#define JNI_TRUE 1
jsize integer type 은 기수 인덱스와 사이즈를 나타냅니다.
typedef jint jsize;
Reference Type
JNI 는 Java object들과 매핑되는 대양한 reference type 을 가지고 있습니다. JNI reference type 은 다음과 같은 hierarchy 로 구성되어 있습니다.
C에서는 JNI reference type 을 모두 jobject 로 받습니다. 예를 들어
typedef jobject jclass;
C++ 에서는 JNI 가 여러개의 dummy class 들을 제공하며, 이것들은 subtype 할 수 있습니다. 예를 들어
class _jobject { };
class _jclass:public _jobject{};
...
typedef _jobject *jobject;
typedef _jclass *jclass;
Field and Method IDs
Method 와 field ID 는 일반적인 C pointer type 입니다.
struct _jfieldID; /* opaque structure */
typedef struct _jfieldID *jfieldID; /* field IDs */
struct _jmethodID;
/* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */
The Value Type
jvalue union 는 argument array 의 element type로서 사용됩니다. 다음과 같이 정의되지요.
typedef union jvalue{
jboolean z;
jbyte b;
jchar c;
jshrot s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
Type Signatures
JNI 는 Java VM 의 type signature type 을 사용합니다. 다음 table 은 type signature 를 보여줍니다.
Type Signature | Java Type |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L fully-qualified-class | fully-qualified-class |
[ type | type[] |
(arg-types) ref-type | method type |
long f ( int n, String s, int[] arr );
는 다음과 같은 signature 를 같습니다.
(ILjava/lang/String;[I) J
Modified UTF-8 Strings
JNI 는 여러 string type 표현을 위해 modified UTF-8 string 을 사용합니다. Modified UTF-8 string 은 Java VM 에서 사용하는 녀석과 같은 녀석입니다. Modified UTF-8 string 은 non-null ASCII character 만 갖고 있는 녀석으로, 한 character 당 한 byte 를 소모합니다. 그렇지만 모든 Unicode character 를 표현 가능합니다.
모든 \u001 에서 \u007F 까지의 character 들은 1 byte 로 표현 가능합니다.
null character 인 \u0000 과 \u0080 에서\u07FF 까지는 x 와 y 한바이트씩의 조합으로 표현될 수 있습니다.
x는
1 1 0 bits 10-6
y는
1 0 bits 5-0
bytes는 ( (x & 0x1f) << 6 ) + ( y & 0x3f ) 로 표현됩니다.
\u0800 부터 \uFFFF 까지의 Character 들은 x, y, z 의 3바이트로 표현됩니다.
x:
1 1 1 0 bits 15-12
y:
1 0 bits 11-6
z:
1 0 bits 5-0
bytes 는 ((x&0xf)<<12) + ((y&0x3f)<<6)+(z&0x3f) 로 표현됩니다.
U+FFFF 이상의 code points 를 포함한 character 들은 ( 소위 말하는 보조 characters ) 는 2개의 UTF-16 representation 2개의 대용코드단위로 encoding 되어 표현됩니다. 각각의 대용코드단위는 3개의 byte 로 표현됩니다. 다시 말해 보조 character 는 6개의 byte u, v, w, x, y, 그리고 z 로 표현됩니다.
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
6개의 byte 를 이용하여 0x10000 + ((v&0x0f)<<16)+((w&0x3f)<<10)+(y&0x0f)<<6) + (z&0x3f) 로 표현됩니다.
여러개의 byte 로 표현되는 character 들의 byte들은 class file에 big-endian ( high byte first ) order 로 저장됩니다.
standard UTF-8 format 에 관련해서 더 많은 정보는 다른 자료를 참조하세요.
도움이 되셨다면 손가락 꾸욱~
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Java] JNI Invocation API. (0) | 2012.03.22 |
---|---|
[Java] JNI functions. (0) | 2012.03.22 |
[Java] Thread 의 Monitor 에 대한 개념. (0) | 2012.03.22 |
[Java] JNI Design Overview. ( JNI 의 전체 구조 ) (0) | 2012.03.21 |
[Java] JNI 가 뭔가요? ( JNI Introduction ) (2) | 2012.03.21 |
댓글