¿ì¸®´Â ÀÌÁ¦±îÁö ÀÚ¹Ù¿¡¼ ´Ù¸¥ ¾ð¾îÀÇ ¸Þ¼µå¸¦ È£ÃâÇØ¼ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ »ìÆì º¸¾Ò½À´Ï´Ù. À̹ø¿¡´Â ÀÌÀÇ ¹Ý´ë °æ¿ìÀÎ C¿¡¼ ÀÚ¹ÙÀÇ ¸Þ¼µå È£ÃâÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¼±î ÇÕ´Ï´Ù. Native Method ³»ºÎ¿¡¼ ÀÚ¹ÙÀÇ ¸Þ¼µå¸¦ È£ÃâÇÏ´Â ¹æ¹ýÀº ¹Ù·Î ¾Õ Àý¿¡¼ ¾ð±ÞÇÑ °´Ã¼ÀÇ º¯¼ö¿¡ Á¢±ÙÇÏ´Â ¹æ¹ý°ú ¸Å¿ì À¯»çÇÑ ´Ü°è¸¦ °ÅĨ´Ï´Ù.
n 1´Ü°è : ÀÚ¹Ù °´Ã¼ÀÇ Å¸ÀÔ ¾Ë¾Æ¿À±â
n 2´Ü°è : ÀÚ¹Ù °´Ã¼ÀÇ Å¸ÀÔ¿¡¼ºÎÅÍ, È£ÃâÇÏ·Á´Â ¸Þ¼µåÀÇ ½Äº° Á¤º¸¸¦ ¾Ë¾Æ¿À±â
n 3´Ü°è : ¸Þ¼µåÀÇ ½Äº° Á¤º¸¸¦ »ç¿ëÇØ¼ ¸Þ¼µå¸¦ È£ÃâÇϱâ
2´Ü°è¿Í 3´Ü°è¿¡¼ º¯¼öÀÇ ½Äº° Á¤º¸ ´ë½Å, ¸Þ¼µåÀÇ ½Äº° Á¤º¸¸¦ »ç¿ëÇÏ´Â °Í¸¸ÀÌ ´Þ¶óÁ³½À´Ï´Ù. ¸Þ¼µåÀÇ ½Äº° Á¤º¸´Â jmethodID¶ó´Â JNI°¡ ¹Ì¸® Á¤ÀÇÇØ ³õÀº ŸÀÔÀ» »ç¿ëÇÕ´Ï´Ù.
ÇѰ¡Áö ÁÖÀÇÇÒ Á¡ÀÌ ÀÖ´Ù¸é, ¸Þ¼µåÀÇ °æ¿ì ¸Å°³º¯¼ö¿Í ¹Ýȯ °ªÀ» °¡Áö±â ¶§¹®¿¡, ÀÌ·± ¸Å°³º¯¼ö¿Í ¹Ýȯ°ªÀ» Native Method°¡ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï Ư¼öÇÑ Ã³¸®¸¦ ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ µÎ°³ÀÇ Á¤¼ö¸¦ ¸Å°³º¯¼ö·Î ¹Þ¾Æ¼ ±× °öÀ» ±¸ÇÑ ÈÄ ¹Ýȯ ½ÃÄÑÁÖ´Â ¸Þ¼µå°¡ ÀÖ´Ù°í ÇսôÙ. ¿ì¸®´Â ÀÌ ¸Þ¼µå¸¦ C¿¡¼ È£ÃâÇØ »ç¿ëÇÏ·Á°í ÇÕ´Ï´Ù.
MethodControl.java(µÎ°³ÀÇ int Çü µ¥ÀÌÅ͸¦ ¹Þ¾Æ¼ °öÀ» ±¸ÇÑ ÈÄ ¹ÝÈ¯ÇØ ÁÖ´Â ¸Þ¼µå) |
public class MethodControl { static { System.loadLibrary("control"); } public native void add(); public int multi(int a, int b){ return a*b; } public static void main(String[] args) throws Exception{ new MethodControl().add(); } } |
C:\JavaExample\20> javac JavaObject.java C:\JavaExample\20> javah JavaObject |
20.5ÀýÀÇ [Ç¥ 20.2]¸¦ º¸¸é, ¸Þ¼µåÀÇ ¸Å°³º¯¼ö¿Í ¹ÝȯÇüÀº ´ÙÀ½°ú °°ÀÌ Ç¥ÇöÀÌ µË´Ï´Ù. ¾ÕÀÌ ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀÌ°í µÚ°¡ ¹ÝȯµÇ´Â µ¥ÀÌÅÍÀÇ Å¸ÀÔÀÔ´Ï´Ù.
n ( arg-types ) ret-type
int add(int a, int b) ¸Þ¼µåÀÇ ¸Å°³ º¯¼ö¿Í ¹Ýȯ ÇüÀ» À§ ¹æ½Ä´ë·Î Ç¥ÇöÇϸé, ´ÙÀ½°ú °°½À´Ï´Ù.
n (II)I
intÇü ¸Å°³ º¯¼ö°¡ µÎ°³À̱⠶§¹®¿¡, À̸¦ ³ªÅ¸³»´Â ¡°I¡± ¹®ÀÚ°¡ Ưº°ÇÑ ±¸ºÐÀÚ ¾øÀÌ ¿¬¼ÓÀ¸·Î ¾²¿©Á® ÀÖ°í, ¸®ÅÏ Å¸ÀÔ ¿ª½Ã int À̹ǷΠ¡°I¡±¶ó°í Ç¥ÇöµÇ¾ú½À´Ï´Ù.
±×·¯¸é, ½ÇÁ¦·Î MethodControl°´Ã¼ÀÇ multi()¸Þ¼µå¸¦ È£ÃâÇÏ´Â Native MethodÀÇ Äڵ带 ÀÛ¼ºÇØ º¸°Ú½À´Ï´Ù.
MethodControl.c(MethodControlÀÇ multi()¸Þ¼µå¸¦ È£ÃâÇÏ´Â Native ÄÚµå) |
#include <jni.h> #include "MethodControl.h" #include <stdio.h> JNIEXPORT void JNICALL Java_MethodControl_add (JNIEnv *env, jobject obj){ jclass class_methodcontrol = (*env)->GetObjectClass(env, obj); jmethodID m_id = (*env)->GetMethodID(env, class_methodcontrol, "multi", "(II)I"); jint a, b, c; a = 5; b = 10; c = (*env)->CallIntMethod(env, obj, m_id, a, b); printf("c = %d \n", c); } |
C:\JavaExample\method>cl -Ic:\jdk1.3.1\include -Ic:\jdk1.3.1\include\win32 -LD M ethodControl.c -Fecontrol.dll ¡¦¡¦ MethodControl.c ¡¦¡¦ /dll /implib:control.lib /out:control.dll MethodControl.obj Creating library control.lib and object control.exp C:\JavaExample\method>java MethodControl c = 50 |
´Ù¸¥ ÄÚµåµéÀº ¾Õ°ú °°°í, ¸Þ¼µåÀÇ ÂüÁ¶°ªÀ» ¹Þ´Â ºÎºÐ¸¸ »ìÆìº¸¸é µÉ °Í °°½À´Ï´Ù.
n jmethodID m_id = (*env)->GetMethodID(env, class_methodcontrol, "multi", "(II)I");
¿©±â¼ ÀÎÀÚ·Î ¾²ÀÎ ¡®multi¡¯´Â ÀÚ¹Ù¿¡¼ÀÇ ¸Þ¼µå À̸§À̰í, ¡®(II)I¡¯Àº ¸Þ¼µåÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» ³ªÅ¸³À´Ï´Ù. ¾ÕÀÇ ¡®(II)¡¯´Â ¸Þ¼µå¿¡ ¾²ÀÎ ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ̰í, µÚÀÇ ¡®I¡¯´Â ¹ÝȯµÇ´Â °á°ú°ªÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀÔ´Ï´Ù.
´ÙÀ½Àº CallIntMethod()¸Þ¼µå¸¦ »ç¿ëÇØ¼, ÀÚ¹ÙÀÇ ¸Þ¼µå¸¦ C¿¡¼ È£ÃâÇØ °á°ú°ªÀ» »Ì¾Æ³»´Â ÄÚµåÀÔ´Ï´Ù.
n c = (*env)->CallIntMethod(env, obj, m_id, a, b);
ÀÚ¹ÙÀÇ multi()¸Þ¼µå¸¦ È£ÃâÇϱâ À§ÇØ, ¾Õ¿¡¼ GetMethodID()¸Þ¼µå·Î ±¸ÇÑ ¸Þ¼µåÀÇ ÂüÁ¶°ªÀ» ÀÎÀÚ·Î ÁÖ¾ú½À´Ï´Ù. ±×¸®°í ¡®a¡¯¿Í ¡®b¡¯´Â C¿¡¼ »ç¿ëÇÒ º¯¼öÀ̸§ ÀÔ´Ï´Ù.
JNI°¡ Á¦°øÇÏ´Â ¸Þ¼µå È£Ãâ ÇÔ¼öµéÀº ´ÙÀ½°ú °°½À´Ï´Ù. µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ÀûÀýÇÏ°Ô »ç¿ëÇÏ½Ã¸é µË´Ï´Ù.
Call<returntype>Method |
CallBooleanMethod CallByteMethod CallCharMethod CallDoubleMethod CallFloatMethod CallIntMethod CallLongMethod CallObjectMethod CallShortMethod CallVoidMethod |
Ç¥ 20-4 JNI¿¡¼ Á¦°øÇÏ´Â ¸Þ¼µå È£Ãâ ÇÔ¼ö
¢Ñ ÀÚ¹Ù °´Ã¼ÀÇ ¸Þ¼µå È£ÃâÇϱâ |
´ÙÀ½ÀÇ ´Ü°è¸¦ °ÅÃļ ÀÚ¹Ù ¸Þ¼µå¸¦ È£ÃâÇÕ´Ï´Ù l 1´Ü°è : ÀÚ¹Ù °´Ã¼ÀÇ Å¸ÀÔ(jclas) ¾Ë¾Æ¿À±â l 2´Ü°è : ÀÚ¹Ù °´Ã¼ÀÇ Å¸ÀÔ¿¡¼ºÎÅÍ, È£ÃâÇÏ·Á´Â ¸Þ¼µåÀÇ ½Äº° Á¤º¸(jmethodID)¸¦ ¾Ë¾Æ¿À±â l 3´Ü°è : ¸Þ¼µåÀÇ ½Äº° Á¤º¸¸¦ »ç¿ëÇØ¼ ¸Þ¼µå¸¦ È£ÃâÇϱâ |
jabookÀúÀÚ¸íÇÔ |
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù4ºÎ ÀúÀÚ:ÃÖ¿µ°ü |