¼Ò¼³°°Àº ÀÚ¹Ù 4ºÎ  Á¦20Àå J N I  20.4 ¹®ÀÚ¿­ Àü´Þ ÀÎÀÚ  

20.4 ¹®ÀÚ¿­ Àü´Þ ÀÎÀÚ

 

¾Õ Àý¿¡¼­ ¼³¸íÇÑ ÀÚ¹ÙÀÇ ±âº»Çü µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇÏ´Â °Í ¿Ü¿¡µµ, Native Method´Â ÀÚ¹Ù ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ÀϹÝÀûÀÎ °´Ã¼¿¡µµ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. JNI°¡ ±âº»Çü µ¥ÀÌÅÍ Å¸ÀÔÀ» À§ÇØ ¹Ì¸® Á¤ÀÇµÈ Native Method¿ë µ¥ÀÌÅÍ Å¸ÀÔÀ» Á¦°øÇßµíÀÌ, °´Ã¼¸¦ Á¶ÀÛÇϱâ À§ÇÑ ÇÔ¼öµé ¿ª½Ã ¹Ì¸® ¸¸µé¾î¼­ Á¦°øÇϰí ÀÖ½À´Ï´Ù. JNI°¡ Á¦°øÇÏ´Â ÀÌ ÇÔ¼öµéÀ» »ç¿ëÇØ¼­ Native Method´Â ÀÚ¹Ù °´Ã¼ÀÇ ÂüÁ¶°ªÀ» ¾ò¾î³¾ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í, ¾ò¾îÁø ÂüÁ¶°ªÀ» ÅëÇØ °´Ã¼ Çʵ忡 Á¢±ÙÇϰí, ¸Þ¼­µå¸¦ È£ÃâÇÏ´Â ÀÏÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù.

 

À̹ø Àý¿¡¼­´Â ÀÚ¹ÙÀÇ °´Ã¼ Áß¿¡¼­ StringÀ̶ó´Â Ưº°ÇÑ °´Ã¼¸¦ Native Method³»¿¡¼­ ´Ù·ç´Â ¹æ¹ýÀ» °£´ÜÇÑ ¿¹Á¦¿Í ÇÔ²² »ìÆì º¸°Ú½À´Ï´Ù.

 

ÀÚ¹ÙÀÇ StringÀº Native Method¿¡°Ô jstringÀ̶ó´Â JNI°¡ ¹Ì¸® Á¤ÀÇÇØ ³õÀº µ¥ÀÌÅÍ ÇüÅ·ΠÁ¦°øÀÌ µË´Ï´Ù. jstringÀÇ °æ¿ì ±âº»Çü µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇÒ ¶§¿Í´Â ´Þ¸® ¸î °¡Áö °í·ÁÇÒ »çÇ×µéÀÌ ÀÖ½À´Ï´Ù. ÀÚ¹Ù¿¡¼­´Â StringÀ» À§ÇØ 16ºñÆ®ÀÇ Unicode ¹®ÀÚ ¼¼Æ®¸¦ »ç¿ëÇÕ´Ï´Ù. ¹Ý¸é, C¿¡¼­´Â ÀϹÝÀûÀ¸·Î 8ºñÆ®ÀÇ ¹®ÀÚ ¹è¿­·Î ¹®ÀÚ¿­À» Ç¥ÇöÇÕ´Ï´Ù. ±×·¡¼­ ¾Æ·¡ÀÇ ¿¹Á¦¿Í °°ÀÌ Native Method¿¡°Ô ¸Å°³ º¯¼ö·Î ³Ñ¾î¿Â jstringÀ» ¹Ù·Î Ãâ·ÂÇÏ¸é ¹®Á¦°¡ ¹ß»ýÇÕ´Ï´Ù.

 

jstringÀÇ À߸øµÈ »ç¿ë¹ý

JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj , jstring prompt) {
    printf("%s", prompt);
    ...

}

 

 ÀÚ¹ÙÀÇ StringÀ» Native Method°¡ Á¤»óÀûÀ¸·Î Á¢±ÙÇϰí Á¶ÀÛÇÏ·Á¸é, ÀÚ¹ÙÀÇ StringÀ» Native Method°¡ ÀÎ½Ä °¡´ÉÇÑ ÇüÅ·Πº¯È¯ ½ÃÄÑÁà¾ß ÇÒ °ÍÀÔ´Ï´Ù. JNI´Â ÀÚ¹ÙÀÇ 16ºñÆ® À¯´ÏÄÚµå ¹®ÀÚ¿­°ú C¾ð¾îÀÇ 8ºñÆ® ¹®ÀÚ¿­ »çÀÌÀÇ º¯È¯À» À§ÇØ UTF-8 Æ÷¸ËÀ» »ç¿ëÇÕ´Ï´Ù. UTF-8 Æ÷¸ËÀº ÀÚ¹Ù°¡ »ç¿ëÇÏ´Â 16ºñÆ® À¯´ÏÄڵ带 Á¤ÇØÁø ·ê¿¡ ¸ÂÃç¼­ 8ºñÆ®µéÀÇ ÁýÇÕÀ¸·Î Ç¥ÇöÇÑ °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î À¯´ÏÄÚµå Áß¿¡¼­µµ 8ºñÆ® ¸¸À» »ç¿ëÇÏ¿© Ç¥ÇöµÇ´Â ¹®ÀÚµéÀº ASCIIÄÚµå·Î Ç¥ÇöÇϰí, ±× ¿ÜÀÇ ASCII ÄÚµå·Î Ç¥Çö ÇÒ ¼ö ¾ø´Â ¹®ÀÚµéÀº 2°³ ȤÀº 3°³ÀÇ 8ºñÆ® ¹­À½À¸·Î Âɰ³¾î Ç¥ÇöÇÕ´Ï´Ù. ÀÌ·¸°Ô Çϸé, ASCII ¹®ÀÚµéÀº Á¤»óÀûÀ¸·Î Ãâ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù.

 

JNI´Â Native Method°¡ ÀÚ¹ÙÀÇ StringÀ» Á¶ÀÛÇÒ ¼ö ÀÖµµ·Ï, ÀÚ¹ÙÀÇ String°ú UTF-8 Æ÷¸Ë »çÀÌÀÇ º¯È¯°ú °°Àº ÀÏÀ» ó¸®ÇØ ÁÖ´Â ¹Ì¸® Á¤ÀÇµÈ ÇÔ¼ö¸¦ Á¦°øÇÕ´Ï´Ù. ±× Áß ´ÙÀ½ µÎ°³ÀÇ ÇÔ¼ö´Â °¢°¢ ÀÚ¹ÙÀÇ StringÀ» UTF-8 Æ÷¸ËÀ¸·Î º¯°æÇØ ÁÖ°í, ¿ªÀ¸·Î ÀÚ¹Ù StringÀ» ±¸¼ºÇÏ°Ô ÇØÁÝ´Ï´Ù.

 

GetStringUTFChars ¸Þ¼­µå ¿ä¾à

const jbyte* GetStringUTFChars(JNIEnv*  env, jstring  str, jboolean*  isCopy) : jstringÀ» UTF-8 Æ÷¸ËÀ¸·Î ÀÎÄÚµùÇÑ ¹®ÀÚ ¹è¿­·Î ¹Ù²Ù°í, ±× ¹è¿­ÀÇ Æ÷ÀÎÅ͸¦ ¹ÝÈ¯ÇØ ÁÝ´Ï´Ù

jstring str : UTF-8 Æ÷¸ËÀ¸·Î ÀÎÄÚµùÇÒ ¹®ÀÚ¿­À» ³ªÅ¸³À´Ï´Ù.                                   

iboolean* isCopy : º¹»çº»À» ¸¸µé°ÍÀÎÁö ¿©ºÎ¸¦ ³ªÅ¸³À´Ï´Ù.

 

NewStringUTF ¸Þ¼­µå ¿ä¾à

jstring NewStringUTF(JNIEnv*  env, const char bytes[]) : UTF-8 Æ÷¸Ë ¹®ÀÚ¿­·ÎºÎÅÍ jstringÀ» ±¸¼ºÇؼ­ ¹ÝȯÇÕ´Ï´Ù.                             

 const char bytes[] : UTF ¹®ÀÚ ¹è¿­À» ³ªÅ¸³À´Ï´Ù.

 

 ´ÙÀ½ ¿¹Á¦´Â À§ µÎ°³ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ Native Method ³»¿¡¼­ jstringÀ» Àоî¿À°í, »ý¼ºÇÏ¿© ÀÚ¹Ù·Î º¸³»´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù. ¸ÕÀú ÀÚ¹Ù ÆÄÀÏÀ» ÀÛ¼ºÇØ º¾½Ã´Ù.

 

MessageType.java(jstring »ç¿ë ¿¹Á¦ ÀÚ¹Ù ÆÄÀÏ)

public class MessageType {

   static {

     System.loadLibrary("message");

   }

   public native String printMessage(String str);  

   public static void main(String[] args)  throws Exception {

       MessageType h = new MessageType();

       System.out.println(h.printMessage("Type anything? : "));

   }

}

C:\JavaExample\20>javac MessageType.java

C:\JavaExample\20>javah MessageType

 

 ¶Ç Çѹø °­Á¶ÇÏÁö¸¸, ¶óÀ̺귯¸® ¸ÕÀú ·ÎµùÇϰí, native ¸Þ¼­µå¸¦ ¼±¾ðÇÕ´Ï´Ù.

 

n        System.loadLibrary("message");

n        public native String printMessage(String str); 

 

 ´ÙÀ½Àº C¾ð¾î·Î ¸Þ¼­µå¸¦ ±¸ÇöÇÏ´Â ºÎºÐÀÔ´Ï´Ù.

 

MessageType.c(jstring »ç¿ë ¿¹Á¦ C ÆÄÀÏ)

#include <jni.h>

#include "MessageType.h"

#include <stdio.h>

JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) {

   char buf[128];

   const char *str = (*env)->GetStringUTFChars(env, msg, 0);

   printf("%s", str);

   (*env)->ReleaseStringUTFChars(env, msg, str);

   scanf("%s", buf);

   return (*env)->NewStringUTF(env, buf);

}

C:\JavaExample\20>cl -Ic:\jdk1.3.1\include -Ic:\jdk1.3.1\include\win32 -LD MessageType.c

 -Femessage.dll

 

C:\JavaExample\20>java MessageType

Type anything? : Hi!jabook

Hi!jabook

 

 ÀÚ¹Ù ÆÄÀÏÀ» ½ÇÇà½ÃŰ¸é ¡°Type anything? :¡±À̶õ ¹®ÀåÀÌ Ãâ·ÂµÇ°í, ¡°Hi!jabook¡±À̶õ ¹®ÀåÀ» ÀÔ·ÂÇÑ ÈÄ¿¡ ¿£Å͸¦ Ä¡¸é ´Ù½Ã ±× ¹®ÀåÀÌ Ãâ·ÂµÇ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

 

jstringŸÀÔÀÇ msg¸¦ GetStringUTFChars()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ UTF-8 ¹®ÀÚ¿­·Î º¯°æÇØ ÁÝ´Ï´Ù.

 

n        const char *str = (*env)->GetStringUTFChars(env, msg, 0);

 

±× ´ÙÀ½, printf()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ Ãâ·ÂÀ» Çϰí, ReleaseStringUTFChars()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ÀÚ¿øÀ» ÇØÁö ½ÃÄÑ ÁÝ´Ï´Ù. ReleaseStringUTFChars()ÇÔ¼ö´Â Native Method³»¿¡¼­ UTF-8 Æ÷¸Ë ¹®ÀÚ¿­ÀÇ »ç¿ëÀÌ ³¡³µÀ¸´Ï, ¸Þ¸ð¸®¿¡¼­ ÀÚ¿øÀ» ÇØÁö ½Ã۶ó°í ÀÚ¹Ù°¡»ó¸Ó½Å¿¡°Ô ¾Ë·Á ÁÖ´Â ¸Þ¼­µå ÀÔ´Ï´Ù.

 

n        printf("%s", str);

n        (*env)->ReleaseStringUTFChars(env, msg, str);

 

ReleaseStringUTFChars() ÇÔ¼ö

void ReleaseStringUTFChars(JNIEnv* env, jstring msg, const jbyte bytes[]) : °¡»ó¸Ó½Å¿¡°Ô ´õ ÀÌ»ó UTF-8 Æ÷¸Ë ¹®ÀÚ¿­À» »ç¿ëÇÏÁö ¾Ê´Â´Ù°í ¾Ë·ÁÁÝ´Ï´Ù

jstring msg : ÀÚ¹ÙÀÇ String °´Ã¼

const jbyte bytes[] : GetStringUTFChars ÇÔ¼ö·ÎºÎÅÍ ¾ò¾îÁø UTF-8 Æ÷¸Ë ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍ

 

GetStringUTFChars()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ UTF-8 ¹®ÀÚ¿­À» »ç¿ëÇÏ°í ³ª¸é ¹Ýµå½Ã ReleaseStringUTFChars()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ »ç¿ëÀÌ ³¡³µÀ½À» ¸í½ÃÀûÀ¸·Î ÀÚ¹Ù°¡»ó¸Ó½Å¿¡°Ô ¾Ë·Á Áà¾ß ÇÕ´Ï´Ù. ¸¶Áö¸· ÁÙ¿¡¼­´Â, »ç¿ëÀڷκÎÅÍ ÀÔ·Â ¹ÞÀº ¹®ÀÚ¿­À» NewStringUTF()ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ÀÚ¹ÙÀÇ À¯´ÏÄÚµå ¹®ÀÚ¿­·Î ¸¸µé¾î ¹Ýȯ Çϰí ÀÖ½À´Ï´Ù.

 

n        scanf("%s", buf);

n        return (*env)->NewStringUTF(env, buf);

 

Native MethodÀÇ Äڵ带 Àß º¸½Ã¸é, env¶ó´Â Æ÷ÀÎÅͰ¡ »ç¿ëµÇ´Â°É º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­ Çѹø Áý°í ³Ñ¾î°¡ÁÒ. Æ÷ÀÎÅÍÀÇ °³³äÀº »ç½Ç º¹ÀâÇϰí Çò°¥¸®´Â ºÎºÐÀÌ ¸¹¾Æ¼­ ÀÚ¹Ù¿¡¼­´Â µé¾î³»³õ°í »ç¿ëÇÏÁö´Â ¾ÊÁÒ. Æ÷ÀÎÅͶõ °ÍÀº ¾î¶² ÇϳªÀÇ ÀÚ·á°¡ ÀúÀåµÇ¾î ÀÖ´Â ±â¾ï Àå¼ÒÀÇ À§Ä¡¿Í ÁÖ¼Ò¸¦ Á÷Á¢ °¡¸®Å°´Â Á¤º¸ ÀÔ´Ï´Ù. ÀÚ¹Ù¿¡¼­´Â ÂüÁ¶¶õ °ÍÀ» ÅëÇØ ¸Þ¸ð¸®¸¦ Âü°íÇÏ´Â °ÍÀº ÀÌ¹Ì ¾Ë°í ÀÖ´Â »ç½ÇÀÔ´Ï´Ù. ±×·¯°í º¸¸é, ¿ì¸®°¡ ÀÚ¹Ù¿¡¼­ ¾Ë°Ô ¸ð¸£°Ô Æ÷ÀÎÅÍÀÇ ¼û°ÜÁø °³³äÀ» »ç¿ëÇØ ¿Ô´Ù´Â °ÍÀ» ´À³¢½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

 

 »ç½Ç Áö±Ý±îÁö »ìÆìº» ¸ðµç ¿¹Á¦¿¡¼­ Native MethodÀÇ Ã¹¹øÂ° ¸Å°³ º¯¼ö´Â env Æ÷ÀÎÅÍ ¿´½À´Ï´Ù. ÀÌ Æ÷ÀÎÅÍ´Â JNI°¡ ¹Ì¸® Á¤ÀÇÇØ ³õÀº ÇÔ¼öµéÀ» ÂüÁ¶Çϱâ À§Çؼ­ ¹Ýµå½Ã ¸ðµç Native Method°¡ ù¹øÂ°·Î °¡Á®¾ß ÇÏ´Â ¸Å°³ º¯¼ö ÀÔ´Ï´Ù. ¶ÇÇÑ, JNI°¡ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§µµ ù¹øÂ° ¸Å°³ º¯¼ö·Î ÀÌ Æ÷ÀÎÅ͸¦ ³Ñ°Ü Áà¾ß ÇÕ´Ï´Ù. ÀÌ Æ÷ÀÎÅ͸¦ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ(interface pointer)¶ó°í Çϴµ¥, ÀÌ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ´Â JNI°¡ Á¦°øÇÏ´Â ÇÔ¼öµéÀ» ÂüÁ¶Çϰí ÀÖ´Â Æ÷ÀÎÅ͵éÀÇ Å×À̺íÀ» °¡¸®Åµ´Ï´Ù.

 

±×¸² 20-4 JNI ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ

 

ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ »ç¿ëÇØ¼­ ¿ì¸®´Â °´Ã¼¿¡ Á¢±ÙÇϱâ À§ÇØ JNI°¡ Á¦°øÇÏ´Â ÇÔ¼öµéÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ Àý¿¡¼­´Â ÀÌ·¯ÇÑ ÇÔ¼öµéÀ» »ç¿ëÇØ¼­ ÀÚ¹ÙÀÇ ÀϹÝÀûÀÎ °´Ã¼¿¡ Á¢±ÙÇÏ¿© º¯¼öµéÀ» Á¶ÀÛÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸°Ú½À´Ï´Ù.

 

 

¢Ñ ¹®ÀÚ¿­ Àü´Þ ÀÎÀÚ

ÀÚ¹Ù StringÀº 16 ºñÆ® ¹®ÀÚ¿­À̱⠶§¹®¿¡, UTF-8 Æ÷¸ËÀ¸·Î º¯È¯Çؼ­ »ç¿ëÇØ¾ß ÇÑ´Ù.

l        JNI°¡ Á¦°øÇÏ´Â ¹®ÀÚ Á¶ÀÛ ÇÔ¼ö »ç¿ë

: GetStringUTFChars, NewStringUTF, ReleaseStringUTFChars

l       JNI´Â Á¦°øÇÏ´Â ÇÔ¼ö¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ Á¦°ø



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù4ºÎ
ÀúÀÚ:ÃÖ¿µ°ü