ÀÌ»ó¿í bumwoogi@gmail.com£ü»õ·Î¿î ±â¼úÀ» ¹è¿ì´Â °ÍÀ» ÁÁ¾ÆÇÏ°í ´Ù¹æ¸é¿¡ °ü½ÉÀÌ ¸¹Àº ¿ÀÁö¶øÀïÀÌ °³¹ßÀÚ. ¾ó¸¶Àü±îÁö ¹«ÀÎÀá¼öÇÔÀ» ¸¸µå´Â °ÍÀ» °èȹÇÏ¿´À¸³ª µµÁßÇÏÂ÷ ÇÏ¿´°í, Áö±ÝÀº Àü Àηù¿¡ °øÇåÇÒ ´ë´ÜÇÑ ¼ÒÇÁÆ®¿þ¾î¸¦ ¸¸µå´Â °ÍÀ» ²Þ²Ù°í ÀÖ´Ù.
À̹ø Ä÷³Àº °¡»óÀÇ ½Ã³ª¸®¿À¸¦ ÅëÇØ ½ÇÁ¦ ÇÁ·ÎÁ§Æ® ÁøÇà Áß¿¡ ¹ú¾îÁú ¼ö ÀÖ´Â ¹®Á¦»óȲÀ» Á¦½ÃÇÏ°í µ¿½Ã¿¡ ÀÌ ¹®Á¦¸¦ ÇØ°áÇØ³ª°¡´Â °úÁ¤À» ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
| µîÀåÀι°
¡Ü Çã¿ì´ë ´ë¸® : ¸î´ÞÀü °æ·Â»ç¿ø °øÃ¤·Î »õ·Î ÀÔ»çÇÑ Àι°·Î Java¸¦ »ç¿ëÇØºÃ´Ù´Â ÀÌÀ¯¸¸À¸·Î ³»ý óÀ½À¸·Î ¾Èµå·ÎÀ̵å Ç÷§Æû¿¡ ±âÁ¸¿¡ C++·Î ÀÛ¼ºÇÑ ¼Ò½º¸¦ ¸¶À̱׷¹ÀÌ¼Ç ÇÏ´Â ¾÷¹«¸¦ ¸Â´Â´Ù. Çã¿ì´ë´Â ¸ÖÂÄ ÇÏÁö¸¸ ¼º°ú°¡ ¾ø´Ù°í ÀÏÁ¤¸¸ Â÷ÀåÀ¸·Î ºÎÅÍ Çã¿ì´ë¶ó´Â º°¸íÀ» ¾ò¾ú´Ù. ¡Ü ½ÅÀÍÇÑ ¼±¹è : Çã¿ì´ë ´ë¸®ÀÇ Çб³ ¼±¹è·Î ¸ð¹ÙÀÏ ºÐ¾ß¿¡¼ ¾ÈÇØº»°Ô ¾ø´Â ´ë´ÜÇÑ ½Ç·ÂÀÚ ÀÌÁö¸¸, ÀÏÀ» ³Ê¹« »ç¶ûÇÏ´Â ³ª¸ÓÁö Àΰ£°ü°è´Â º°·Î ¼ÒÁúÀÌ ¾ø¾î º¸ÀÌ´Â ½Ã´ÏÄÃÇÑ ¼º°ÝÀÇ ¼ÒÀ¯ÀÚ, Çã¿ì´ë ´ë¸®ÀÇ Áú¹®¿¡ ¸Å¹ø Åü¸í½º·´°Ô ´ë´ä ÇÏÁö¸¸ ±× ¼Ó¸¶À½¿¡´Â ÈĹ踦 ½º½º·Î ±ú¿ìÄ¡°Ô ÇÏ·Á´Â ³ª¸§ÀÇ Ã¶ÇÐÀ» °¡Áö°í ÀÖ´Ù. ¡Ü ÀÏÁ¤¸¸ Â÷Àå : À̹ø ÇÁ·ÎÁ§Æ®ÀÇ Ã¥ÀÓÀÚ·Î, ÀÏ¿¡ ´ëÇÑ Ã¥ÀÓ°¨ÀÌ ÅõöÇÏÁö¸¸ »ó³ÉÇÑ ¼º°ÝÀº ¾Æ´Ï´Ù. ƯÈ÷ ÀÏÁ¤À» ¾î±â´Â »ç¶÷À» ¹«Ã´ ½È¾îÇÑ´Ù. |
Çã¿ì´ë ´ë¸®´Â ¾ó¸¶Àü ÀÏÁ¤¸¸ Â÷ÀåÀ¸·Î ºÎÅÍ 1ÁÖÀϰ£ÀÇ ½Ã°£µ¿¾È ÀÌÀü ´©±º°¡°¡ C++ ·Î ÀÛ¼ºÇÑ ¹æ´ëÇÑ ¾çÀÇ xml ¹®¼ parser¸¦ À̹ø ÇÁ·ÎÁ§Æ®¿¡ Àç»ç¿ë ÇÒ ¼ö ÀÖµµ·Ï ¾Èµå·ÎÀ̵å Ç÷§Æû¿¡ ¸¶À̱׷¹ÀÌ¼Ç Ç϶ó´Â Áö½Ã¸¦ ¹Þ¾Ò´Ù. Çã¿ì´ë ´ë¸®¿¡°Ô ÁÖ¾îÁø ½Ã°£Àº °íÀÛ 7ÀÏ. 7ÀÏ µ¿¾È Çã¿ì´ë ´ë¸®°¡ ¾î¶»°Ô ÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ´ÂÁö ÇÔ²² ÁöÄѺ¸µµ·Ï ÇÏÀÚ.
¼±¹è, ¾Èµå·ÎÀÌµå ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀº Java·Î Çϴ°ÅÁö?
»ýÀü óÀ½ ¾Èµå·ÎÀ̵å Ç÷§Æû¿¡¼ °³¹ßÀ» ½ÃÀÛÇÏ´Â Çã¿ì´ë ´ë¸®´Â ½ÅÀÍÇÑ ¼±¹è¸¦ ã¾Æ°¡¼ Á¶¾ðÀ» ±¸ÇÏ°Ô µÇ¾ú´Ù.
“¼±¹è, Â÷Àå´Ô²² ¾Èµå·ÎÀ̵å Ç÷§Æû¿¡ ±âÁ¸¿¡ c++·Î ÀÛ¼ºÇÑ ¾öû³ ¾çÀÇ parser ¼Ò½º¸¦ ¸¶À̱׷¹ÀÌ¼Ç Ç϶ó´Â Áö½Ã¸¦ ¹Þ¾Ò´Âµ¥, ³ª À̰Š´Ù java·Î ´Ù½Ã ¸¸µé¾î¾ß Çϴ°ǰ¡?”
¼±¹è´Â ÇѽÉÇÏ´Ù´Â ¹ÝÀÀÀ¸·Î ƯÀ¯ÀÇ ½Ã´ÏÄÃÇÑ ÇѼûÀ» ³»½¬¸ç ÀÌ·¸°Ô ¾ê±âÇÑ´Ù.
“¾Èµå·ÎÀ̵å= javaÀÇ °ø½ÄÀº ¾Æ´Ï¾ß. ¾Èµå·ÎÀ̵å Ç÷§ÆûÀÌ ¾î¶»°Ô ±¸¼ºµÅÀÖ´ÂÁö ¸ÕÀú È®ÀÎÇØ º¸´Â°Ô ¾î¶§?”
¾Èµå·ÎÀ̵å Ç÷§ÆûÀº Å©°Ô ¸®´ª½º Ä¿³Î°ú, C/C++·Î ÀÛ¼ºÇÑ ¶óÀ̺귯¸®(º¸Åë ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¶ó ºÎ¸¥´Ù), ¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥ÀÇ »À´ë¸¦ Á¦°øÇÏ´Â ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©¿Í ±âº» ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î ±¸¼ºµÅ ÀÖ´Ù.
¸®´ª½º Ä¿³ÎÀº OSÀÇ ±âº» ±â´ÉÀΠŽºÅ©°£ÀÇ ½ºÄÉÁÙ¸µ°ú ¸Þ¸ð¸®, µð½ºÅ©, ³×Æ®¿öÅ© µîÀÇ ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ½Ã½ºÅÛ ÄÝÀ» Á¦°øÇÑ´Ù. ÀÌ´Â ¸®´ª½º Ä¿³Î ÀºÎºÐ¿¡ ÃÊ·Ï»öÀ¸·Î Ç¥½ÃµÈ ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ ÅëÇØ ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÆíÇÏ°Ô »ç¿ë ÇÒ ¼ö ÀÖ´Â ÇüÅ·ΠÁ¦°øµÈ´Ù.
¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥Àº ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©(ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ Á¦°øÇϰí Á¦ÀÛ¿¡ µµ¿òÀ» ÁÖ´Â Java class·Î ±¸¼º)À» ÀÌ¿ëÇÏ°í ¿ª½Ã Java¾ð¾î·Î ÀÛ¼ºÇÑ´Ù.
ÀÌ JavaÆÄÀÏÀ» ¾Èµå·ÎÀ̵å SDK¸¦ ÀÌ¿ëÇØ ºôµåÇÏ¸é ³»ºÎÀûÀ¸·Î JavaÄÄÆÄÀÏ·¯¿Í dex converter¸¦ °ÅÃÄ Dalvik VM(¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥À» µ¿ÀÛ½ÃŰ´Â VMÀ¸·Î ÀϹÝÀûÀÎ Java VM°ú´Â ´Ù¸£´Ù.) À§¿¡¼ µ¿ÀÛÇÏ´Â byte ÄÚµå·Î º¯È¯ÇÏ°Ô µÈ´Ù.
°á·ÐÀûÀ¸·Î ¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥(Java·Î ÀÛ¼º)Àº ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©(.jarÇüÅÂÀÇ Java class.)¸¦ ÀÌ¿ëÇØ VM¿¡¼ Á¦°øÇÏ´Â ÄÚ¾î ¶óÀ̺귯¸®(core library) ±â´ÉÀ» »ç¿ëÇÏ°Ô µÇ°í, ÀÌ ÄÚ¾î ¶óÀ̺귯¸®´Â ¸®´ª½º Ä¿³Î À§¿¡¼ µ¿ÀÛÇÏ´Â ´Ù¾çÇÑ C/C++ ¶óÀ̺귯¸®(c/c++)¸¦ È£ÃâÇÏ°Ô µÈ´Ù. ÀÌ ¶óÀ̺귯¸®´Â Çʿ信 µû¶ó ¸®´ª½º Ä¿³ÎÀÇ system callÀ» È£ÃâÇÏ°Ô µÈ´Ù. À§ ±×¸²¿¡¼ È»ìÇ¥ ¹æÇâÀ» µû¶ó °¡¸é¼ È®ÀÎÇÏÀÚ.
À§ ±×¸²¿¡¼ ¾Èµå·ÎÀÌµå ·±Å¸ÀÓ °èÃþ°ú ¶óÀ̺귯¸® °èÃþÀ» ¿¬°áÇÏ´Â ¿ÞÂÊ È»ìÇ¥·Î Ç¥ÇöµÈ ºÎºÐ¿¡¼ ÀϹÝÀûÀÎ ÇÔ¼öÈ£Ãâ °ü°è ¿Ü¿¡ Ãß°¡ÀûÀ¸·Î C/C++ ↔ java È£Ãâ »çÀÌÀÇ ‘glue’°¡ Á¸ÀçÇÑ´Ù. °á±¹ ÀÌ ´öºÐ¿¡ ¾Èµå·ÎÀ̵å ÇÁ·¹ÀÓ¿öÅ©´Â ÀÚ¿¬½º·´°Ô OSÀÇ º¹ÀâÇÑ ±â´ÉÀ» ¸®´ª½º Ä¿³Î·ÎºÎÅÍ ºô·Á ¾µ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
Çã¿ì´ë ´ë¸®´Â °á±¹ C/C++ ↔ Java»çÀÌÀÇ ‘glue’¸¦ ¸¸µé¸é ±âÁ¸ ¼Ò½º¸¦ ¸®´ª½º »ó¿¡ Æ÷ÆÃ ÇÏ´Â Á¤µµÀÇ ³ë·ÂÀ¸·Î Àç»ç¿ë ÇÒ ¼ö ÀÖ°Ú´Ù´Â °á·ÐÀ» ³»¸®°í, °ð¹Ù·Î Java ↔ C/C++ ¸¦ È£Ãâ ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ã¾Æº¸±â ½ÃÀÛÇß´Ù.
.jpg)
Java ↔ C/C++ »çÀÌÀÇ glue´Â ¾î¶²°ÍÀ» »ç¿ëÇÒ±î?
ÀϹÝÀûÀ¸·Î Java¿¡¼ C/C++ ¸ðµâÀ» »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇÑ´Ù.
1. Java Native Access (JNA)
ÀÚ¹Ù Äڵ忡¼ ³×ÀÌÆ¼ºê ÄÚµå¿Í °°Àº ÇüÅ·Π³×ÀÌÆ¼ºê ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ½ÄÀ¸·Î ±âÁ¸ ÄÚµåÀÇ ÃÖ¼ÒÇÑÀÇ ¼öÁ¤À¸·Î ÀÀ¿ëÀÌ °¡´ÉÇØ, ÃÖ»óÀÇ ¹æ¹ýÀ¸·Î »ý°¢µÇ³ª ÇöÀç ¾Èµå·ÎÀ̵å Dalvik VM¿¡¼ Áö¿øÇÏÁö ¾Ê´Â ¹æ¹ýÀÌ´Ù.
2. Java Native Interface (JNI)
Java ÃÊâ±âºÎÅÍ Á¸ÀçÇÑ Java/Native interface ¹æ¹ýÀ¸·Î ¾Èµå·ÎÀ̵å Dalvik VM¿¡¼ Áö¿øÇÏ´Â ¹æ¹ýÀ¸·Î ½ÇÁ¦ ¾Èµå·ÎÀ̵å Ç÷§Æû ¼Ò½º ¿©·¯ ºÎºÐ¿¡¼ »ç¿ëµÇ°í ÀÖ´Ù. ±×·¯³ª ÀÌ ¹æ½ÄÀº raw formÀ» ´Ù·ç´Â ÇüÅ·Π°³¹ßÇØ¾ß Çϱ⠶§¹®¿¡ °³¹ß ½Ã°£ÀÌ ¸¹ÀÌ ¼Ò¿äµÇ°í ¿¡·¯¸¦ ¹ß»ý ½Ãų¸¸ÇÑ ¿ä¼Ò°¡ ¸¹´Ù.
3. Simplified Wrapper and Interface Generator (SWIG)
JNI¸¦ Á» ´õ ½±°Ô »ç¿ë ÇÒ¼ö ÀÖµµ·Ï ÇØÁÖ´Â µµ±¸·Î C/C++ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÑ ÆÄÀÏÀ» ÀÔ·Â ¹Þ¾Æ C/C++ JNI wrapper Äڵ带 »ý¼ºÇÑ´Ù. ÀÌ ¹æ¹ý ¿ª½Ã Dalvik VM°ú´Â ȣȯ¼º ¹®Á¦°¡ Á¸ÀçÇÑ´Ù.
| Native library(C/C++) ·Î °³¹ßÇÒ °Í ÀÎÁö¿¡ ´ëÇÑ ¼±Åà ±âÁØ
¾Èµå·ÎÀ̵忡¼´Â J2SEÀÇ ´ëºÎºÐÀÇ ±â´É°ú, ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©¸¦ ÅëÇØ ´Ù¾çÇÑ API ¼ÂÀ» Á¦°øÇϰí, Java¸¦ »ç¿ëÇÏ¿© ´ëºÎºÐÀÇ ÀÀ¿ëÇÁ·Î±×·¥À» Á¦ÀÛ Çϴµ¥ ºÎÁ·ÇÔÀÌ ¾øµµ·Ï ¹è·ÁÇϰí ÀÖ´Ù. ½Å±Ô °³¹ß½Ã ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©¸¦ ÅëÇØ Á¦°ø¹ÞÀ» ¼ö ¾ø´Â ÀϺΠ±â´É(´ëºÎºÐ ¿ÜºÎ ±â±â ³ª µð¹ÙÀ̽º Á¾¼ÓÀûÀÎ) ºÎºÐ°ú ¼º´ÉÀÌ ¾ÆÁÖ Áß¿äÇÑ ÀϺΠ±â´ÉÀ» Á¦¿ÜÇϰí´Â Java¸¦ »ç¿ëÇÏ¿© °³¹ßÇÏ´Â °ÍÀÌ ÇÁ·ÎÁ§Æ® Àå±âÀûÀÎ °üÁ¡¿¡¼´Â ³ªÀº ÆÇ´ÜÀ̶ó »ý°¢µÈ´Ù. C/C++·Î ÄÚµå·Î °³¹ßÀº À¯Áöº¸¼ö¿Í µð¹ö±ë Ãø¸é¿¡¼ ¹ø°Å·Ó°í ºÒÆíÇÑ ºÎºÐÀÌ ÀÖÀ¸¸ç JNI¸¦ ÀÌ¿ëÇÏ¿© Java ÂÊÀ¸·Î glue¸¦ ¸¸µå´Â ÀÏÀÌ ¿¹»óÇÏ´Â °Í¸¸Å °£´ÜÇÑ ÀÏÀº ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ¿©±â¼ Á¦½ÃÇÏ´Â °¡»óÀÇ ½Ã³ª¸®¿À ¿ª½Ã ÁÖÁ¦¸¦ À̲ø¾î °¡±â À§ÇØ ´Ü¼øÈ½ÃŲ ¿¹ÀÏ »ÓÀÌÁö ½ÇÁ¦·Î ±âÁ¸¿¡ C/C++·Î ÀÛ¼ºÇÑ Äڵ带 ¸¶À̱׷¹ÀÌ¼Ç ÇÏ´Â ÀÛ¾÷ÀÌ ÁÖ¾îÁú °æ¿ì ¾ó¸¶³ª ÀÎÅÍÆäÀ̽º°¡ ´Ü¼øÇÑÁö, ±âÁ¸Äڵ忡¼ Ç÷§Æû Á¾¼ÓÀûÀÎ ºÎºÐÀÌ ¾ó¸¶³ª ÀÖÀ¸¸ç À̰ÍÀ» ¾Èµå·ÎÀ̵å(Linux kernel)¿¡ Æ÷ÆÃÇϱâ À§Çؼ ¾ó¸¶³ª ³ë·ÂÀÌ ÇÊ¿äÇÑÁö, ȤÀº HTTP³ª STLµî ¾Èµå·ÎÀ̵å Native library´Ü¿¡¼ ÃæºÐÈ÷ Á¦°øÇÏÁö ¾Ê´Â ±â´ÉÀ» »ç¿ëÇÑ ºÎºÐÀÌ ÀÖ¾î¼ ÀçÀÛ¾÷À̳ª Ãß°¡ Æ÷ÆÃ ÀÛ¾÷ÀÌ ÇÊ¿äÇÑÁö ÃæºÐÈ÷ °í·ÁÇÏ¿© ±âÁ¸ ¸ðµâÀ» ÀçȰ¿ëÇÒ °ÍÀÎÁö, JavaÄÚµå·Î ´Ù½Ã ÀÛ¾÷ÇÒ °ÍÀÎÁö °áÁ¤ÇØ¾ß ÇÒ °Í ÀÌ´Ù. |
Çã¿ì´ë ´ë¸®´Â Dalvik VM°úÀÇ È£È¯¼º ¹®Á¦¿Í º¸ÆíÀûÀ¸·Î »ç¿ëÇÏ´Â ±â¼úÀ̶ó´Â Á¡À» °¨¾ÈÇØ JNI¸¦ ÀÌ¿ëÇØ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇϱâ·Î Çß´Ù.
Á¡½É½Ã°£¿¡ Çã¿ì´ë ´ë¸®´Â ÀÚ½ÅÀÌ JNI¸¦ ÀÌ¿ëÇÏ¿© ±âÁ¸ parser¼Ò½º¸¦ °ÅÀÇ ÀçȰ¿ë ÇÒ¼öÀÖ´Â ¹æ¹ýÀ» »ý°¢ÇØ ³Â´Ù°í ½ÅÀÍÇÑ ¼±¹è¿¡°Ô ÀÚ¶ûÀ» ´Ã¾î³õ¾Ò´Ù. À̶§, ¹äÀ» ¸Ô´ø ½ÅÀÍÇÑ ¼±¹è´Â ÀÌ·± À̾߱⸦ ³²±ä µÚ, ¾Æ¹«Àϵµ ¾ø¾ú´Ù´Â µí ½Ä»ç¸¦ °è¼Ó Çß´Ù. ½ÅÀÍÇÑ ¼±¹è°¡ ³²±ä ¸»Àº ÀÌ·¸´Ù.
“±×·³ ¾Èµå·ÎÀÌµå ½Ã½ºÅÛ¿¡ Æ÷ÇÔÇØ¼ ºôµå Çϰڴٴ ¾ê±â¾ß? ¹èÆ÷´Â ¾î¶»°Ô ÇҰǵ¥?”
±×·¸´Ù. ±×¸²¿¡¼ º¸´Â C/C++ ¶óÀ̺귯¸®´Â ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀÇ ¿µ¿ªÀ¸·Î Çã¿ì´ë ´ë¸®´Â ¹èÆ÷¹æ¹ý¿¡ ´ëÇØ °í·ÁÇÏÁö ¸øÇÑ °ÍÀÌ´Ù. ¾Èµå·ÎÀÌµå ¿¡¹Ä·¹ÀÌÅ͸¦ ½ÇÇàÇϰí <ȸé 1>¿¡¼ ÃÊ·Ï»öÀ¸·Î Ç¥½ÃÇÑ C/C++ ¶óÀ̺귯¸® ÆÄÀÏÀÇ ½ÇÁ¦ À§Ä¡¸¦ È®ÀÎÇØº¸ÀÚ. ¾Æ·¡¿Í °°ÀÌ Ä¿¸Çµå â¿¡¼ emulator¸¦ ½ÇÇàÇϰųª ÀÌŬ¸³½º IDE¸¦ ÅëÇØ emulator¸¦ ½ÇÇàÇÑ´Ù.
.jpg)
¿¡¹Ä·¹ÀÌÅͰ¡ Á¤»óÀûÀ¸·Î ½ÇÇàµÇ¸é À§¿Í °°ÀÌ ¿¡¹Ä·¹ÀÌÅÍ È¸éÀ» È®ÀÎÇÒ ¼ö Àִµ¥, À̶§ Äֿܼ¡¼´Â <¸®½ºÆ® 1>°ú °°ÀÌ adb ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© shellÀ» ½ÇÇàÇÑ´Ù.
|
<¸®½ºÆ® 1> adb shellÀ» ÀÌ¿ëÇÏ¿© ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® È®ÀÎÇϱâ |
<¸®½ºÆ® 1>ÀÇ ³»¿ëÀ» <ȸé 3>¸¦ ÅëÇØ È®ÀÎÇØº¸ÀÚ.
.jpg)
<ȸé 3>¿¡¼´Â ¾Èµå·ÎÀ̵å Ç÷§Æû¿¡¼ Á¦°øÇÏ´Â ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®°¡ À§Ä¡ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
Çã¿ì´ë ´ë¸®°¡ ÁغñÇÏ´Â ÇÁ·ÎÁ§Æ®ÀÇ °á°ú¹°Àº ´Ù¿î·Îµå °¡´ÉÇÑ ÇüÅ·Π¹èÆ÷µÇ¾î¾ß Çϴµ¥ /system µð·ºÅ丮´Â ´Ù¿î·ÎµåÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¼³Ä¡ÇÒ ¼ö ÀÖ´Â ¿µ¿ªÀÌ ¾Æ´Ï±â ¶§¹®¿¡ /system µð·ºÅ丮 ´ë½Å /data µð·ºÅ丮¿¡¼ µ¿ÀÛ ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ã¾Æ¾ß ÇÑ´Ù.
¾Èµå·ÎÀÌµå ½Ã½ºÅÛ À̹ÌÁö
¾Èµå·ÎÀÌµå ½Ã½ºÅÛ À̹ÌÁö´Â ¸®´ª½º ¿î¿µÃ¼Á¦¿¡¼ ÆÄÀϽýºÅÛÀº ´Ü¼øÈ÷ ÀÚ·áÀÇ ÀúÀå±â´É »Ó ¾Æ´Ï¶ó ¿î¿µÃ¼Á¦ µ¿ÀÛ¿¡ ÇÊ¿äÇÑ Çʼö Á¤º¸¸¦ Æ÷ÇÔÇϰí ÀåÄ¡ °ü¸® µîÀÇ Æ¯º°ÇÑ ¿ëµµ·Îµµ »ç¿ëÇϹǷΠ¼±ÅÃÇ׸ñÀÌ ¾Æ´Ï¶ó Çʼö Ç׸ñÀÌ´Ù. ½Ã½ºÅÛ À̹ÌÁö´Â ¾Èµå·ÎÀ̵å ÇÁ·¹ÀÓ¿öÅ©¸¦ ±¸µ¿Çϱâ À§ÇØ ÇʼöÀûÀÎ Ç׸ñÀ¸·Î <¾Èµå·ÎÀ̵å SDK¼³Ä¡ µð·ºÅ丮>/platforms/<Ç÷§Æû¹öÀü>/images/system. img ¿¡¼ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
ÀÌ À̹ÌÁöÆÄÀÏÀº ½ÇÁ¦ ¿¡¹Ä·¹ÀÌÅͰ¡ ±¸µ¿µÉ ¶§ /system directory¿¡ ¸¶¿îÆ®ÇÏ°Ô µÇ´Âµ¥, À̳»¿ëÀº adb shellÀ» ½ÇÇà½ÃŲ ÈÄ ÃÖ»óÀ§ µð·ºÅ丮ÀÇ init.rcÆÄÀÏ¿¡¼ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
/system µð·ºÅ丮´Â ÀÓº£µðµåÇÏ¿© žÀçÇÒ ±âº» ÀÀ¿ëÇÁ·Î±×·¥À» Æ÷ÇÔÇØ ¾Èµå·ÎÀ̵å ÇÁ·¹ÀÓ¿öÅ©¿¡ ÇÊ¿äÇÑ ¶óÀ̺귯¸® ¼³Á¤ÆÄÀÏ µîÀÌ µé¾îÀÖ´Â ¿µ¿ªÀ¸·Î Ãß°¡·Î ´Ù¿î·Îµå¹ÞÀº ÀÀ¿ëÇÁ·Î±×·¥°ú´Â ±¸º°µÈ´Ù. ´Ù¿î·Îµå ¹ÞÀº ÀÀ¿ëÇÁ·Î±×·¥Àº /data µð·ºÅ丮¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.
¾Èµå·ÎÀ̵å SDK ¼³Ä¡
¾Õ¼ ¼³¸íµÈ ºÎºÐµéÀ» ½Ç½ÀÇϱâ À§Çؼ´Â ¾Èµå·ÎÀ̵å SDK¸¦ ¼³Ä¡ÇÏ°í ¹öÃß¾ó µð¹ÙÀ̽º¸¦ »ý¼ºÇØ¾ß Çϴµ¥, ÀÌ ºÎºÐÀº À̹ø Ä÷³ÀÇ ÁÖÁ¦¿Í´Â ¹þ¾î³ª¹Ç·Î ¾Æ·¡ URLÀ» Âü°íÇØ ¼³Ä¡Çϱ⠹ٶõ´Ù.
http://developer.android.com/sdk/index.html
Çã¿ì´ë ´ë¸®, NDK¿Í ¸¸³ª´Ù
´ÙÀ½³¯ ¹èÆ÷¹®Á¦·Î °í¹ÎÇÏ´ø Çã¿ì´ë ´ë¸®´Â ¾Æ·¡ÀÇ ¾Èµå·ÎÀÌµå °³¹ßÀÚ À¥»çÀÌÆ®¸¦ ÅëÇØ NDK¿¡ ´ëÇÑ ³»¿ëÀ» Á¢Çß´Ù.
http://developer.android.com/sdk/ndk/1.6_r1/index.html
NDK´Â C/C++·Î ÀÛ¼ºÇÑ ÄÚµå·Î ¸®´ª½º OS ±â¹ÝÀÇ ARM binary¸¦ »ý¼ºÇϱâ À§ÇÑ Å©·Î½º ÅøÃ¼ÀÎÀ» Á¦°øÇÑ´Ù. ¿©±â¼ ‘Å©·Î½º ÅøÃ¼ÀÎ’À̶õ Ÿ±ê¸Ó½Å°ú´Â ´Ù¸¥ ȯ°æ¿¡¼ Ÿ±ê ¸Ó½Å¿ëÀ¸·Î ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÒ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â ÅøÀε¥ ÄÄÆÄÀÏ·¯ ¸µÄ¿ ±×¸®°í ±âŸ ÄÄÆÄÀÏ¿¡ ÇÊ¿äÇÑ À¯Æ¿¸®Æ¼¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.
|
<¸®½ºÆ® 2> Application.mk ÆÄÀÏ |
ÀϹÝÀûÀÎ x86ȣȯ CPUÀÇ À©µµ¿ì³ª ¸®´ª½º PC±â¹Ý ȯ°æ¿¡¼ ARMÀ̳ª MIPSµî ÀÓº£µðµå ¸Ó½ÅÀÇ CPU¿¡¼ µ¿ÀÛÇÏ´Â ¹ÙÀ̳ʸ®¸¦ ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
±×¸®°í ¾Æ·¡¿Í °°Àº ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï header fileÀ» Á¦°øÇϴµ¥, ÀÌ ³»¿ëÀº ¾Õ¼ Á¦½ÃµÈ adb ½©¿¡¼ È®ÀÎÇÑ /system/lib µð·ºÅ丮¿¡ ÀÖ´Â ¶óÀ̺귯¸®ÀÇ ÀϺÎÀÓÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
(1) libc(C library)
(2) libm(math library)
(3) JNI interface
(4) libz (zip ¾ÐÃà library)
(5) liblog(Android logging library)
(6) OpenGL ES library (3D graphic library, NDK 1.6¹öÀüºÎÅÍ)
Ãß°¡ÀûÀ¸·Î ¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥ ÆÐŰÁö ÆÄÀÏ(.apk)¿¡ native library¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. Çã¿ì´ë ´ë¸®°¡ ã´ø ¹Ù·Î ±× ¹æ¹ýÀÌ´Ù. ±×·³ ÀÌÁ¦ Çã¿ì´ë ´ë¸®¿Í ÇÔ²² NDK¸¦ ¼³Ä¡ÇØ º¸µµ·Ï ÇÏÀÚ.
(1) http://developer.android.com/sdk/ndk/1.6_r1/index.html ¿¡¼ À©µµ¿ì¿ë ÆÐŰÁö¸¦ ´Ù¿î·Îµå ¹Þ´Â´Ù.
(2) Àû´çÇÑ À§Ä¡¿¡ (1)¿¡¼ ´Ù¿î·Îµå ¹ÞÀº ¾ÐÃàÆÄÀÏÀ» Ǭ´Ù.
(3) www.cygwin.com¿¡¼ ÃֽŠcygwin À» ¼³Ä¡ÇÑ´Ù.
(4) ¼³Ä¡ÇÑ Cygwin bash shellÀ» ½ÇÇàÇϰí bash shell¿¡¼ /cygdrive/<NDK ¼³Ä¡ °æ·Î> ·Î À̵¿ÇØ ‘Build/host-setup.sh’ ¶ó°í ¸í·ÉÀ» ¼öÇàÇÑ´Ù.
ÀÌó·³ ¼øÂ÷ÀûÀ¸·Î µû¶óÇÏ°í ³ª¸é, <ȸé 4>¿Í °°ÀÌ ‘Host setup complete…’¶ó´Â ¹®±¸°¡ ³ªÅ¸³ª´Âµ¥, ÀÌ·² °æ¿ì ¼Â¾÷ÀÌ ¼º°øÇÑ °ÍÀÌ´Ù.
.jpg)
ÀÌÁ¦ ¼³Ä¡°¡ ³¡³µÀ¸´Ï ¸ÕÀú NDK¿¡ »ùÇ÷ΠÁ¦°øµÇ´Â hello-jni ¿¹Á¦¸¦ ºôµåÇØ º¸ÀÚ. ºôµå½Ã¿¡´Â $make APP=hello-jni¶ó°í ¸í·ÉÀ» ¼öÇàÇÑ´Ù. Àçºôµå½Ã¿¡´Â -B ¿É¼ÇÀ» »ç¿ëÇÏ°í ½ÇÁ¦ build command¸¦ ¸ðµÎ È®ÀÎÇÏ°í ½ÍÀº °æ¿ì V=1 ¿É¼ÇÀ» »ç¿ëÇÑ´Ù.
.jpg)
ºôµå°á°ú·Î apps/hello-jni/project/libs/areabi/libhello-jni.so°¡ »ý¼ºµÇ¾ú´ÂÁö È®ÀÎÇÏÀÚ.
¾î¶»°Ô NDK¿¡¼ Á¦°øÇÏ´Â ÅøÀ» ÀÌ¿ëÇÏ¿© ¿¹Á¦°¡ ºôµå µÇ´ÂÁö ¾Ë°í ½Í´Ù¸é, apps/hello-jni/Application.mk ¿Í sources/ hello-jni/Android.mk ÆÄÀÏÀ» ¿¾îº¸ÀÚ.
ÀϹÝÀûÀÎ make ÆÄÀϰú °°Àº ÇüÅÂÀÌ¸ç ºôµå¸¦ À§ÇÑ º¯¼ö¸¦ ¼³Á¤ÇÏ´Â ºÎºÐÀ» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ Application.mk ÆÄÀÏ¿¡´Â ÀÀ¿ëÇÁ·Î±×·¥ ¿¡¼ ¾î¶² ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® ¸ðµâÀ» »ç¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇØ ±â¼úÇØ¾ß ÇÑ´Ù. ÀÌ ºÎºÐÀº ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ ºôµåÇÏ´Â °Í°ú´Â Á÷Á¢ÀûÀÎ °ü°è°¡ ¾øÀ¸³ª ÀÌ ÆÄÀÏÀ» ÂüÁ¶ÇØ ºôµåÇÒ Å¸±ê ¸ðµâÀ» °áÁ¤Çϱ⠶§¹®¿¡ ÇʼöÀûÀ¸·Î ÀÛ¼ºÇØ¾ß ÇÑ´Ù.
|
<¸®½ºÆ® 3> Android.mk ÆÄÀÏ |
Android.mk ÆÄÀÏ¿¡´Â ½ÇÁ¦ shared library·Î ºôµåÇÒ c/c++ ÆÄÀÏ ¸ñ·Ï °ú »ç¿ëÇÏ´Â ¶óÀ̺귯¸® ¸ñ·Ï, compile/link option µîÀ» ±â¼úÇØ¾ß Çϴµ¥, À̶§ º¯¼ö LOCAL_MODULE ¿¡ ¸ðµâÀ̸§À» ±â¼úÇÏ°Ô µÈ´Ù. ÀÌ¾î º¯¼ö LOCAL_SRC_FILES ¿¡ ºôµåÇÏ·Á°í ÇÏ´Â ¼Ò½º ÆÄÀϸíÀ» ±â¼úÇϰí, ÆÄÀÏ¸í »çÀÌ´Â ½ºÆäÀ̽º·Î ±¸º°ÇÑ´Ù.
¸¶Áö¸· ÁÙÀÌ shared library, Áï .so ÆÄÀÏ·Î ºôµå Çϰڴٴ ¶æÀÌ´Ù. ÀÌ·¸°Ô ±â¼úÇϸé ÀÚµ¿À¸·Î lib+¸ðµâ¸í+.so ÇüÅÂÀÇ ÆÄÀÏÀ» ºôµåÇÏ°Ô µÈ´Ù.
Ãß°¡·Î ƯÁ¤ ¶óÀ̺귯¸®¸¦ »ç¿ëÇϱâ À§Çؼ´Â ¾Æ·¡¿Í °°ÀÌ LOCAL_LDLIBS º¯¼ö¿¡ ³»¿ëÀ» ±â¼úÇÑ´Ù. ¾Æ·¡´Â ¾Èµå·ÎÀÌµå ·Î±× ¶óÀ̺귯¸®¸¦ »ç¿ëÇϱâ À§ÇÑ ¿¹ÀÌ´Ù. ¶ÇÇÑ ÀÌ¿¡ ´ëÇÑ Ãß°¡ÀûÀÎ ³»¿ëÀº NDK document Æú´õÀÇ ‘ANDROID-MK.TXT’,’APPLICATION-MK.TXT’,’HOWTO.TXT’ ¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù.
LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib/ -llog
ÀÌÁ¦ ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® ºôµå°¡ ³¡³µÀ¸´Ï ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â Java Äڵ带 »ìÆìº¸ÀÚ. <ȸé 6>°ú °°ÀÌ apps/hello-jni ÇÁ·ÎÁ§Æ®¸¦ ÀÌŬ¸³½º¿¡¼ ¿¾îº¸µµ·Ï ÇÏÀÚ. ¿ÞÂÊ ÆÐŰÁö ÀͽºÇ÷η¯ â¿¡¼ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ» Ŭ¸¯ÇÑ µÚ Import ¸Þ´º¸¦ ¼±ÅÃÇÑ´Ù.
.jpg)
À̾î Existing Projects into Workspace¸¦ ¼±ÅÃÇÑÈÄ app/hello-jni/ µð·ºÅ丮¸¦ ¼±ÅÃÇÑ´Ù. À̸¦ ½ÇÇàÇϸé <ȸé 7>°ú °°ÀÌ Package Explorer¿¡ HelloJni ÇÁ·ÎÁ§Æ®°¡ ·ÎµùµÇ¸é ¼º°øÇѰÍÀÌ´Ù.
.jpg)
ÀÌŬ¸³½º ¸Þ´º¿¡¼ Run->RunÀ» ¼±ÅÃÇϰųª ´ÜÃàŰ·Î Ctrl+F11À» ¼±ÅÃÇÏ¸é ¿¡¹Ä·¹ÀÌÅÍ¿¡¼ Hello-jni ÇÁ·ÎÁ§Æ®ÀÇ °á°ú¸¦ È®ÀÎÇÒ¼ö ÀÖ´Ù.
¿¡¹Ä·¹ÀÌÅͰ¡ ½ÇÇàµÇ´Âµ¥ Á¦¹ý ½Ã°£ÀÌ °É¸®¹Ç·Î Àγ»½ÉÀ» °¡Áö°í ±â´Ù¸®±â ¹Ù¶õ´Ù. ¿¡¹Ä·¹ÀÌÅ͸¦ µ¿ÀÛÇϱâ À§Çؼ´Â Ç÷§Æû ¹öÀü¿¡ ¸Â´Â AVD ÆÄÀÏÀ» ¹Ì¸® »ý¼ºÇØ¾ß Çϴµ¥ ÀÌ ³»¿ëÀº http://developer.android.com/guide/developing/eclipse-adt.htmlÀ» Âü°íÇÏ±æ ¹Ù¶õ´Ù.
.jpg)
´õºÒ¾î ÀÌÀü¿¡ adb shell ¸í·ÉÀ» ÀÌ¿ëÇÑ ¾Èµå·ÎÀÌµå ÆÄÀϽýºÅÛÀ» »ìÆìº¸¾Ò´Âµ¥, À̹ø¿¡´Â ÀÌŬ¸³½º IDE¿¡¼ DDMSÅøÀ» ÀÌ¿ëÇÏ¿© ¼Õ½±°Ô ÆÄÀϽýºÅÛÀ» È®ÀÎÇØº¸ÀÚ. À̶§ ÀÌŬ¸³½º Åø¹Ù ¿À¸¥Æí¿¡¼ DDMS perspective ¹öưÀ» ¼±ÅÃÇÑ´Ù. ¿À¸¥Æí¿¡ File Explorer âÀ» ÀÌ¿ëÇÏ¿© data/data/com.example.hellojni Æú´õÀÇ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖÀ¸¸ç, libÆú´õ¾Æ·¡¿¡ libhello-jni.so ÆÄÀÏÀÌ ÀÖ´Â °Í ¶ÇÇÑ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
.jpg)
<ȸé 9>¿¡¼ º¸¿©Áöµí, °á±¹ ¾Èµå·ÎÀ̵å ÀÀ¿ëÇÁ·Î±×·¥Àº system/lib Æú´õÀÇ ¶óÀ̺귯¸® À̿ܿ¡ /data/data/<ÀÚ½ÅÀÇ packageÀ̸§>/lib ¾Æ·¡ ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ Ãß°¡·Î Âü°íÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â Java ÄÚµå ¸Àº¸±â
Çã¿ì´ë ´ë¸®´Â JavaÄÚµå ¿¡¼ ¾î¶»°Ô C·Î ÀÛ¼ºÇÑ ³×ÀÌÆ¼ºê Äڵ带 Âü°íÇÏ´ÂÁö ±Ã±ÝÇØÁ³´Ù. À̹ø¿¡´Â Çã¿ì´ë ´ë¸®¿Í ÇÔ²² src/com/example/HelloJni.java Äڵ带 »ìÆìº¸ÀÚ
|
<¸®½ºÆ® 4> HelloJni.java ÆÄÀÏ |
<¸®½ºÆ® 4>´Â stringFromJNI ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾òÀº ¹®ÀÚ¿À» textView¿¡ ³»¿ëÀ¸·Î ³Ö¾îÁÖ´Â °£´ÜÇÑ ¼Ò½º·Î, 3°¡Áö Àǹ̷ΠÀÌ¿ëµÈ´Ù.
1) native Ű¿öµå¸¦ ºÙÇô¼ ¼±¾ðºÎ¸¸ ÀÛ¼ºÇÑ´Ù. ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¿¡ ±¸ÇöºÎ°¡ ÀÖÀ½À» ¾Ë·ÁÁØ´Ù.
2) static {..} ºÎºÐÀº ÀÌ class°¡ ·ÎµùµÉ ¶§ È£ÃâµÇ´Â µÇ´Âµ¥ À̶§ ‘hello-jni’ ¶ó´Â À̸§ÀÇ ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®¸¦ ·ÎµùÇ϶ó´Â ÀǹÌÀÌ´Ù.
3) ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® ÇÔ¼ö¶óµµ º¸ÅëÀÇ Java ¸Þ¼Òµå¿Í °°Àº ¹æ½ÄÀ¸·Î »ç¿ëÇÑ´Ù.
À̾î Source/samples/hello-jni.c ÆÄÀÏÀ» ¿¾î¼ ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® ±¸ÇöºÎµµ ÇÔ²² »ìÆìº¸µµ·Ï ÇÏÀÚ.
|
<¸®½ºÆ® 5> ³×ÀÌÆ¼ºê ¶óÀ̺귯¸® ±¸ÇöºÎ ÄÚµå |
<¸®½ºÆ® 5>¸¦ º¸¸é ÇÔ¼öÀ̸§ ¾Õ¿¡ ‘Java_com_example_ hellojni_HelloJni_’ °¡ ºÙ¾î Àִµ¥, ÀÌ ºÎºÐÀº JNI ÇÔ¼öÀ̸§ ±ÔÄ¢¿¡ ÀÇÇØ package¸í_Ŭ·¡½º¸íÀÌ Java¿¡¼ ¼±¾ðÇÑ ÇÔ¼ö À̸§ ¾Õ¿¡ ºÙ°Ô µÈ´Ù. ÇÔ¼öÀÇ ³»¿ëÀº ´Ü¼øÈ÷ “Hello from JNI!” ¶ó´Â ¹®ÀÚ¿À» Java¿¡¼ »ç¿ëÇÏ´Â String ŸÀÔÀ¸·Î º¯È¯ÇÏ¿© ¹ÝȯÇÏ´Â ³»¿ëÀÌ´Ù.
Âü°íÀÚ·á
1. http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html
2. http://developer.android.com/sdk/ndk/1.6_r1/index.html
3. http://www.aton.com/android-native-libraries-for-java-applications/
4. http://www.swig.org/