¾Õ Àý¿¡¼ ¼³¸íÇÑ ÀÚ¹ÙÀÇ ±âº»Çü µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇÏ´Â °Í ¿Ü¿¡µµ, 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ºÎ ÀúÀÚ:ÃÖ¿µ°ü |