본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] JNI Type 과 Data Structure.

by 돼지왕 왕돼지 2012. 3. 22.
반응형



안녕하세요
 돼지왕 왕돼지입니다.


이 글은 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 

예를 들어 Java 함수

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 로 저장됩니다.

modified UTF-8 format 과 standard UTF-8 format는 두 가지 차이가 있습니다. 먼저 standard UTF-8 format 은 null character (char)0 은 one-byte format 이 아닌 two-byte format 을 사용하여 encoding 합니다 modified UTF-8 string 은 embedded null 이 없다는 사실! 두번째로 one-byte, two-byte, three-byte format 은 standard UTF-8 에 이용됩니다. Java VM 은 standard UTF-8 의 four-byte format 을 인식하지 못합니다. 대신 2-times-3-byte format 을 이용합니다.

standard UTF-8 format 에 관련해서 더 많은 정보는 다른 자료를 참조하세요.





도움이 되셨다면 손가락 꾸욱~





반응형

댓글