* Gnu Compiler for JavaÀÇ ¾àÀÚ. java·Î ¾º¿©Áø Äڵ带 Native Code·Î ¹Ù²ãÁÖ´Â ÄÄÆÄÀÏ·¯ ---- [[TableOfContents]] == ±âº»ÀûÀÎ »ç¿ë == === »ç¿ëȯ°æ === GCJ´Â gccÀÇ ÀϺÎÀ̱⠶§¹®¿¡ gcc¸¦ »ç¿ëÇÒ ¼ö Àִ ȯ°æÀÌ µÇ¾î¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¸®´ª½º¿¡¼­´Â »ç¿ëÀÌ °¡´ÉÇϸç À©µµ¿ìÁî¿¡¼­ http://www.mingw.org ¿¡¼­ Á¦°øÇÏ´Â °ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. === °£´ÜÇÑ ¿¹Á¦ === {{{#!vim java public class ExamGCJ { public static void main(String[] args) { System.out.println("ExamGCJ Class GCJ Test"); } } }}} À§¿Í °°Àº ¿¹Á¦¸¦ °¡Áö°í Çغ¸ÀÚ. ¸ÕÀú À§¿Í °°Àº ÆÄÀÏÀ» Çϳª ÀÛ¼ºÇÏ°í ÆÄÀÏ À̸§À» ExamGCJ.java·Î Çؼ­ ÀúÀåÇÑ´Ù. ±×¸®°í ´ÙÀ½°ú °°Àº ¸í·ÉÁÙÀ» ÅëÇؼ­ GCJ·Î ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù. {{{#!vim nosyntax # gcj --main=ExamGCJ ExamGCJ.java -o ExamGCJ }}} ÀÌ·¸°Ô Çϸé ExamGCJ¶ó´Â Native Code¸¦ ´ãÀº ½ÇÇà ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. GCC¿¡ Àͼ÷ÇÏ´Ù¸é ¹Ù·Î ¾Ë ¼ö ÀÖµíÀÌ GCJ¿¡¼­ ¿ª½Ã gcc¿Í ºñ½ÁÇÑ ¿É¼ÇÀÌ »ç¿ëµÈ´Ù. * -o À̸§ ÁöÁ¤ * -c object code¸¸ »ý¼º === µÎ°³ ÀÌ»óÀÇ Å¬·¡½º·Î ÀÌ·ç¾îÁø ÄÚµå ÄÄÆÄÀÏ === {{{#!vim java public class ExamGCJ { public static void main(String[] args) { System.out.println("Two Class GCJ Test"); new LibExamGCJ(); } } }}} {{{#!vim java public class LibExamGCJ { LibExamGCJ() { System.out.println("Two Class GCJ Test --- this is print in lib"); } } }}} À§ÀÇ Äڵ带 °¢ Ŭ·¡½º À̸§À» ÆÄÀÏ À̸§À¸·Î ÇÏ¿© µÎ°³ÀÇ ÄÚµå ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù. ±×¸®°í ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù. {{{#!vim nosyntax # gcj -c LibExamGCJ.java # gcj -c ExamGCJ.java # gcj --main=ExamGCJ ExamGCJ.o LibExamGCJ.o -o ExamGCJ }}} À§¿¡¼­ºÎÅÍ ÀÚ²Ù º¸ÀÌ°ÚÁö¸¸ --mainÀ̶ó´Â ¿É¼ÇÀÌ ÀÖ´Ù. ÀÌÂë µÇ¾úÀ¸¸é ÀÌ ¿É¼ÇÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö ÀÌÇØÇßÀ¸¸®¶ó »ý°¢ÇÑ´Ù ¹Ù·Î mainÀ̶ó´Â ¸Þ¼Òµå°¡ Àִ Ŭ·¡½ºÀÇ À̸§À» ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. À̸¦ ÁöÁ¤ÇØÁÖÁö ¾Ê°í ÄÄÆÄÀÏÀ» Çغ¸±â ¹Ù¶õ´Ù. ºÐ¸í ¿¡·¯¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù. === ¹ÙÀÌÆ®ÄÚµå·ÎºÎÅÍ ÄÄÆÄÀÏ === ÄÄÆÄÀÏ ÇÒ ¶§ .java ´ë½Å .class ÆÄÀÏÀ» ³Ö¾îÁÖ¸é ÄÄÆÄÀÏµÈ ¹ÙÀÌÆ® ÄÚµå·ÎºÎÅÍ ÄÄÆÄÀÏÀÌ °¡´ÉÇÏ´Ù. {{{#!vim nosyntax # gcj -c LibExamGCJ.class }}} ÀÌ°ÍÀÌ ¿Ö ÇÊ¿äÇÒ±î? ÇöÀç gcj´Â java 5ÀÇ ¸î°¡Áö Çâ»óµÈ ±¸¹®À» ÀνÄÇÏÁö ¸øÇÑ´Ù. {{{#!vim nosyntax ForeachExam.java:16: error: Invalid declaration. for(File f : fileList){ ^ }}} À̶§ jdk 1.5ÀÇ javac·Î ¸ÕÀú ¹ÙÀÌÆ®ÄÚµå·Î º¯È¯ÇÑ µÚ gcj¿¡¼­ ÄÄÆÄÀÏÇÏ¸é ¹®Á¦¾øÀÌ »ç¿ëÀÌ °¡´ÉÇÏ´Ù. === ¶óÀ̺귯¸®·Î ¹­¾î¼­ »ç¿ëÇϱâ === ºÐ¸í ¾î¶² ¾ð¾î·Î ÇÁ·Î±×·¡¹ÖÀ» ÇϵçÁö ÀÚÁÖ ¾²´Â Äڵ带 ¹­¾îµÎ°í »ç¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. GCJ¿¡¼­µµ ÀÚÁÖ »ç¿ëÇÏ´Â Äڵ带 ¹­¾îµÎ°í ÇÊ¿äÇÒ¶§ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù. GCJ´Â GCCÀÇ ÀϺδÙ. µû¶ó¼­ GCCó·³ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ¸®´ª½º¸¦ ÀÚÁÖ »ç¿ëÇÏÁö ¾Ê´Â´Ù. µû¶ó¼­ ¿©±âÀÇ ¼³¸íÀÌ À©µµ¿ìÁîÀÇ MinGW¿¡¼­ÀÇ ÀÛ¾÷¿¡ ÃÊÁ¡ÀÌ ¸ÂÃß¾îÁ® ÀÖ´Ù´Â °ÍÀ» Âü°íÇϱ⠹ٶõ´Ù. {{{#!vim nosyntax # ar -crs libexam.a LibExamGCJ.o }}} ÀÌ·¸°Ô Çϸé ÀÌ¹Ì »ý¼ºÇÑ ¿ÀºêÁ§Æ® Äڵ带 ¶óÀ̺귯¸®·Î Æ÷ÇÔ½ÃŲ´Ù. ¿ÀºêÁ§Æ® ÄÚµåÀÇ »ý¼ºÀº ¾Õ¿¡¼­ ¼³¸íÀ» Ç߱⿡ »ý·«ÇÑ´Ù. ¾Æ¹«Æ° ÀÌ·¸°Ô »ý¼ºÇÑ °ÍÀ» °°ÀÌ ¸µÅ©ÇÏ¸é µÇ´Âµ¥ ±×°Í¿ª½Ã GCC¿Í µ¿ÀÏÇÏ´Ù. {{{#!vim nosyntax # gcj --main=ExamGCJ ExamGCJ.o -L.\ -lexam }}} ´ë·« ÀÌ·±½ÄÀ̶ó°í Àû¾îµÎ¸é ÀÌÇظ¦ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ExamGCJ¿Í LibExamGCJ¶ó´Â µÎ°³ÀÇ Å¬·¡½º´Â ÀÓÀÇ·Î ¸¸µé¾î Å×½ºÆ®Çغ¸±â ¹Ù¶õ´Ù. ÇÏÁö¸¸ ÀÌ·±½ÄÀ¸·Î ÇÒ ¶§ ÇÑ°¡Áö ¹®Á¦´Â ExamGCJ.o¸¦ »ý¼ºÇϱâ À§ÇØ GCJ·Î ºôµåÇÒ ¶§ Ŭ·¡½ºÀÇ ÇüŸ¦ ¾Ë¾Æ¾ß.. LibExamGCJ¶ó´Â Ŭ·¡½º¸¦ »ç¿ëÇÒ ¶§ ¿¡·¯¸¦ üũÇϴµ¥ À־ ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. µû¶ó¼­ LibExamGCJ¿Í °°ÀÌ ¶óÀ̺귯¸®·Î ¹­À» ¼Ò½º ÄÚµå´Â ¹ÙÀÌÆ® ÄÚµå·Îµµ »ý¼ºÇؼ­ Jar·Î ¹­¾îµÎ°í ÀÌ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â °æ¿ì¿¡ Ŭ·¡½º Æнº¿¡ Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ ÁÁ´Ù. {{{#!vim nosyntax # gcj -C LibExamGCJ.java # jar cf swt.jar LibExamGCJ.class }}} ÀÌ·± ¹æ¹ýÀ¸·Î °³¹ßÀ» Á»´õ ÆíÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ¹Ì Á¸ÀçÇÏ´Â ÆÐÅ°Áö¸¦ ºôµåÇؼ­ »ç¿ëÇϴµ¥ À¯¿ëÇÏ´Ù. == ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®È­ Çϱâ == GCJ´Â ÁÖ·Î Native Code¸¦ »ý¼ºÇϱâ À§ÇØ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯À̱⠶§¹®¿¡ ÀÚ¹Ù·Î ÀÌ·ç¾îÁø ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®È­ÇÏ¿© ¸µÅ©ÇÏ´Â °ÍÀÌ ¿øÇÒÇÑ °³¹ßÀ» À§ÇØ ¹Ù¶÷Á÷ÇÏ´Ù. ƯÈ÷ ¸µÅ©ÇÒ¶§ ¿ÀºêÁ§Æ®ÄÚµå(.o)´Â »ç¿ëÇÏÁö ¾Ê¾Æµµ °°ÀÌ ¹­Áö¸¸ Á¤Àû¸µÅ©¶óÀ̺귯¸®(.a)´Â ÇÊ¿äÇÑ °Í¸¸ ¹­¾îÁö¹Ç·Î ¶óÀ̺귯¸®È­ Çؼ­ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±×·¯¸é ±× ¹æ¹ýÀ» ÇϳªÀÇ ¿¹Á¦¿Í ÇÔ²² °£´ÜÈ÷ ¼Ò°³ÇÏ°íÀÚ ÇÑ´Ù. === ÆÐÅ°Áö ¾ÈÀÇ ¿ÀºêÁ§Æ®ÄÚµåÀÇ À̸§Àº ¾î¶»°Ô Á¤ÇØÁö´Â°¡? === ÆÐÅ°ÁöÀÇ ±¸¼ºÀ» º¸¸é º¸Åë ÀÌ·± ÇüÅ·ΠµÇ¾î ÀÖÀ» °ÍÀÌ´Ù. java.util.Vector À§¿¡ º¸¸é ¾Ë ¼ö ÀÖµíÀÌ java.util ÆÐÅ°ÁöÀÇ VectorŬ·¡½ºÀÌ´Ù. ±×¸®°í ¼Ò½º ÄÚµå ³»¿¡¼­ »ç¿ëÇÏ·Á¸é ´ÙÀ½Ã³·³ import¸¦ ÇÑ´Ù. import java.util.Vector ¹°·Ð GCJ·Î ÄÄÆÄÀÏ ÇÒ ¼Ò½ºµµ ¶È°°ÀÌ ÇÑ´Ù. ±×·³ ÀÌ°ÍÀ» »ç¿ëÇÑ Äڵ带 ¸µÅ©ÇÒ¶§´Â ¾î¶² À̸§À» °¡Áø ¿ÀÇÁÁ§Æ®°¡ ÇÊ¿äÇÑ°¡? ¹Ù·Î ´ÙÀ½°ú °°Àº À̸§À» °¡Áø ¿ÀºêÁ§Æ® Äڵ尡 ÇÊ¿äÇÏ°Ô µÈ´Ù. ¶óÀ̺귯¸® ¾È¿¡¼­ À̾߱âÀÌ´Ù. java_util_Vector.o ±×¸®°í ½ÇÁ¦·Î libgcj.a¾È¿¡ Á¸ÀçÇÑ´Ù. ¾Æ¹«Æ° ±×·¸°Ô ¶óÀ̺귯¸®¸¦ ¸¸µé¾îµÎ°í ÇÊ¿äÇÒ¶§¸¶´Ù... Áï ÇØ´ç ÆÐÅ°Áö¸¦ »ç¿ëÇÒ¶§¸¶´Ù ¿ÀÇÁÁ§Æ® Äڵ尡 ¾Æ´Ñ ¶óÀ̺귯¸®¸¦ ¸µÅ©Çؼ­ »ç¿ëÇÏ¸é µÈ´Ù. === °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇؼ­ ÀÌÇØÇϱâ === ÀÌÁ¦ °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇؼ­ ÀÌÇØÇØ º¸ÀÚ. ÀÌÂëµÇ¸é ¾ÕÀÇ "GCJÀÇ °£´ÜÇÑ ¼Ò°³"¿¡¼­´Â »ç¿ëÇÏÁö ¾Ê¾ÒÁö¸¸ MakefileÀ» »ç¿ëÇÏ´Â°Ô ÆíÇÒ °ÍÀÌ´Ù. ¹°·Ð GCC¸¦ »ç¿ëÇϽô ºÐµéÀº ´ç¿¬È÷ ¹Þ¾Æµé¿©Áö°ÚÁö¸¸ JAVA¸¸ ÇϽôø ºÐµéÀº Á¶±Ý ¾î»öÇϽÇÁöµµ ¸ð¸¥´Ù. º¸Åë ÀÚ¹Ù·Î ÇÁ·Î±×·¡¹ÖÀ» Çϸé Apache ProjectÀÇ Ant°¡ ±× ºñ½ÁÇÑ ¿ªÇÒÀ» Çϱ⠶§¹®¿¡ Ant°¡ Àͼ÷ÇÒ °ÍÀÌ´Ù. ¾Æ¹«Æ° ÀÌÁ¦ ¿ì¸®´Â GCC(Gnu Compiler Collection)À» »ç¿ëÇÏ´Ï Gnu Make ToolÀÎ MakefileÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. ±×¸®°í MakefileÀÇ º¹ÀâÇÑ °ÍÀº ¸ðµÎ Á¦¿ÜÇÏ°í ²À ÇÊ¿äÇÑ ´Ü¼øÇÑ °Í¸¸ »ç¿ëÇÒ °ÍÀ̹ǷΠ°ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. Ȥ½Ã Makefile¿¡ ´ëÇÑ ³»¿ëÀ» ¸ð¸£½Å´Ù¸é kldp.org¿¡¼­ ã¾Æ¼­ °¡º±°Ô Àо±â ¹Ù¶õ´Ù. ±×·³ ÀÌÁ¦ ½ÃÀÛÇϵµ·Ï ÇÏ°Ú´Ù. ¸ÕÀú µð·ºÅ丮 ±¸¼ºÀ» °£´ÜÈ÷ »ìÆ캸ÀÚ. Á¸ÀçÇÏ´Â µð·ºÅ丮´Â ´ÙÀ½°ú °°´Ù. {{{#!vim nosyntax ./bin ./obj ./lib ./src }}} ÀÌ·¸°Ô ³×°³Àε¥... ./src µð·ºÅ丮 ¾Æ·¡ ¼Ò½º¸¸ Á÷Á¢ ÀÛ¼ºÀ» ÇÏ°í ³ª¸ÓÁö µð·ºÅ丮´Â... Make¸¦ Çϸ鼭 °á°ú¹°ÀÌ ÇÊ¿ä¿¡ µû¶ó ÀúÀåµÉ µð·ºÅ丮ÀÌ´Ù. ±×¸®°í ./srcµð·ºÅ丮 ¾Æ·¡¿¡´Â... {{{#!vim nosyntax ./src/org/nahome/hangulee/ }}} ÀÌ·± µð·ºÅ丮°¡ Á¸ÀçÇÑ´Ù. ±×¸®°í hanguleeµð·ºÅ丮 ¾Æ·¡ LibExamGCJ.java, LibExamGCJ2.java¶ó´Â ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù. ±×¸®°í °¢ ÆÄÀÏÀÇ ¼Ò½º ÄÚµå´Â °£´ÜÇÑ ¿¹Á¦¿¡ ¸Â°Ô »ý¼ºÀÚ¸¸ Á¸ÀçÇÑ´Ù. ´ÙÀ½°ú °°´Ù. {{{#!vim java package org.nahome.hangulee; public class LibExamGCJ { LibExamGCJ() { System.out.println("Two Class GCJ Test --- this is print in lib"); } } }}} {{{#!vim java package org.nahome.hangulee; public class LibExamGCJ2 { LibExamGCJ2() { System.out.println("Two Class GCJ Test --- this is print in lib2"); } } }}} ´ÙÀ½Àº ½ÇÁ¦ ¿ì¸®°¡ ¿¹¿¡¼­ »ç¿ëÇÒ MakefileÀÌ´Ù. MakefileÀº »óÀ§.. ±×·¯´Ï±î ./src µð·ºÅ丮°¡ ÀÖ´Â µð·ºÅ丮¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù. {{{#!vim make CLASSPATH = ./src; OBJS = \ obj/org_nahome_hangulee_LibExamGCJ.o \ obj/org_nahome_hangulee_LibExamGCJ2.o CLASSES = \ bin/org/nahome/hangulee/LibExamGCJ.class \ bin/org/nahome/hangulee/LibExamGCJ2.class all:$(OBJS) $(CLASSES) exam.jar lib/libexam.a lib/libexam.a: ar -crs ./lib/libexam.a ./obj/*.o exam.jar: jar cf exam.jar -C bin . bin/org/nahome/hangulee/LibExamGCJ.class:src/org/nahome/hangulee/LibExamGCJ.java gcj -C -fCLASSPATH=$(CLASSPATH) -d bin src/org/nahome/hangulee/LibExamGCJ.java obj/org_nahome_hangulee_LibExamGCJ.o:src/org/nahome/hangulee/LibExamGCJ.java gcj --classpath=$(CLASSPATH) -c src/org/nahome/hangulee/LibExamGCJ.java \ -o obj/org_nahome_hangulee_LibExamGCJ.o bin/org/nahome/hangulee/LibExamGCJ2.class:src/org/nahome/hangulee/LibExamGCJ2.java gcj -C -fCLASSPATH=$(CLASSPATH) -d bin src/org/nahome/hangulee/LibExamGCJ2.java obj/org_nahome_hangulee_LibExamGCJ2.o:src/org/nahome/hangulee/LibExamGCJ2.java gcj --classpath=$(CLASSPATH) -c src/org/nahome/hangulee/LibExamGCJ2.java \ -o obj/org_nahome_hangulee_LibExamGCJ2.o }}} ÀÌ·¸°Ô Áغñ°¡ µÇ¾ú´Ù¸é makeÇغ¸½Ã±â ¹Ù¶õ´Ù. makeÇÏ¸é ¾Æ½Ã°ÚÁö¸¸ ./obj ¾Æ·¡¿¡ ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. ±×¸®°í ./lib ¾Æ·¡¿¡ libexam.a°¡ »ý¼ºµÇ°í »óÀ§¿¡ exam.jarÀÌ »ý¼ºµÉ °ÍÀÌ´Ù. exam.jarÀº ÀÌ ÆÐÅ°Áö¸¦ »ç¿ëÇÒ ¼Ò½º Äڵ带 ÄÄÆÄÀÏ ÇÒ¶§ Ŭ·¡½º Æнº¿¡ ÁöÁ¤Çϱâ À§ÇØ ÇÊ¿äÇÏ´Ù. ÀÚ!.. ÀÌÁ¦ °£´ÜÇÑ ¶óÀ̺귯¸®°¡ ÁغñµÇ¾ú´Ù. === ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ °£´ÜÇÑ ¿¹Á¦ === ¿¹Á¦´Â ´Ù¸¥ µð·ºÅ丮¿¡´Ù°¡ ¸¸µéµµ·Ï ÇÒ °ÍÀÌ´Ù. ±×¸®°í À̹ø¿¡´Â Makefile¾øÀÌ °£´ÜÈ÷ ÄÄÆÄÀÏ ÇÏ´Â °ÍÀ¸·Î ³¡³»µµ·Ï ÇÒ°ÍÀÌ´Ù.. ¿ì¼± ´ÙÀ½°ú °°Àº ÆÄÀÏÀ» ¸¸µç´Ù. {{{#!vim java import org.nahome.hangulee.*; public class ExamGCJ { public static void main(String[] args) { System.out.println("Two Class GCJ Test"); new LibExamGCJ(); new LibExamGCJ2(); } } }}} ÀÌ·¸°Ô ÇÏ°í ´ÙÀ½Ã³·³ ºôµåÇÑ´Ù. {{{#!vim nosyntax gcj --classpath=(À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î)/exam.jar -c ExamGCJ.java -o ExamGCJ.o gcj --main=ExamGCJ ExamGCJ.o -L(À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î) -lexam -o ExamGCJ }}} ÀÌ·¸°Ô Çϸé ExamGCJ¶ó´Â Native Code°¡ ´ã±ä ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. ÀÌ°ÍÀ» ½ÇÇàÇÏ¸é °á°ú´Â... {{{#!vim nosyntax Two Class GCJ Test Two Class GCJ Test --- this is print in lib Two Class GCJ Test --- this is print in lib2 }}} ÀÌ·¸°Ô ³ª¿Ã°ÍÀÌ´Ù.... ÀÌÁ¦ ÀÌÇØ°¡ µÇ´Â°¡? ¹°·Ð À§¿¡¼­ Ŭ·¡½º Æнº¸¦ ÀÌ·¸°Ô ÁöÁ¤Çصµ µÈ´Ù. {{{#!vim nosyntax (À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î)/src }}} ÇÏÁö¸¸ ÀÌ·¸°Ô ÇÏ¸é ¶óÀ̺귯¸®¸¦ ¹èÆ÷ÇÒ¶§ ¾î·Á¿òÀÌ µû¸¦ °ÍÀÌ´Ù. ±×·¯´Ï jarÀ» »ý¼ºÇÏ´Â°Ô Æí¸®ÇÏ´Ù. ÀÚ!.. ÀÌÁ¦ ´õ ³ºÀº ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Â Áغñ°¡ µÇ¾ú´Â°¡? ¶Ç ´Ù¸¥ ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®·Î ¸¸µé¾îº¸°í ½ÍÁö ¾ÊÀº°¡? == Class.forName¸¦ »ç¿ëÇÒ¶§ == JAVA·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§ JDBC µå¶óÀ̹ö¸¦ µ¿ÀûÀ¸·Î ·ÎµùÇÏ´Â °æ¿ì... ±× °æ¿ì ¿Ü¿¡´Â ±×´ÙÁö »ç¿ëµÇÁö ¾ÊÀºµí ÇÏ´Â ¸Þ¼ÒµåÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ µ¥ÀÌÅÍ º£À̽º ¾øÀÌ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ìµµ ÈçÄ¡ ¾ÊÀ¸´Ï ÀÚÁÖ »ç¿ëµÈ´Ù°í º¼ ¼ö µµ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ÀÌ·± Class.forNameÀ̶ó´Â Ŭ·¡½º°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¿¡ ´ëÇؼ­ °£´ÜÈ÷ ¾Ë¾Æº¸ÀÚ. === GCJ·Î ÇÁ·Î±×·¡¹Ö ÇÒ¶§ Class.forName¸Þ¼Òµå === ÀÌÁ¦ ÀÌ ¸Þ¼Òµå¸¦ GCJ¿¡¼­ ¾î¶»°Ô »ç¿ëÇÒ ¼ö ÀÖÀ»±î? À§¿¡¼­ º¸´Ï µ¿ÀûÀ¸·Î ·ÎµùÇϴµ¥... GCJ´Â Çϳª·Î ¸µÅ©ÇÒ¶§ ¹­¾î¼­ »ç¿ëµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë°Ô µÈ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ¼öÇàÇغ¸±â ¹Ù¶õ´Ù. {{{#!vim java public class ExamClassforName { public static void main(String[] args) { System.out.println("Class.forName Example"); try { Class ex = Class.forName("TextClass"); } catch(Exception e) { System.out.println("error = "+e.toString()); } } } }}} Äڵ带 º¸´Ï TestClass¶ó´Â À̸§ÀÇ Å¬·¡½º°¡ ÇÊ¿äÇÏ´Ù. ¾Ë¾Æ¼­ Çϳª ¸¸µéµçÁö... ±×³É Çغ¸µçÁö ¾î¶»°Ôµç Çغ¸±â ¹Ù¶õ´Ù. µÎ°¡Áö ´Ù Çؼ­ ºñ±³Çغ¸´Â °Íµµ ÁÁ´Ù. ¾î¶² °á°ú°¡ ³ª¿À´Â°¡? ¾Æ¸¶µµ ±×³É ÇßÀ»¶§ ´õ ÁÁÀº ¼ÒµæÀ» ¾ò¾úÀ» °ÍÀÌ´Ù. ¾Ë¾Æ¼­ Çϳª ¸¸µé¾úÀ» °æ¿ì¿¡´Â ±×³É ¹«¸®¾øÀÌ ½ÇÇàµÇ°í Á¾·áµÈ´Ù. ÇÏÁö¸¸ ¾øÀ»¶© ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ±× Ŭ·¡½º°¡ ¾ø´Ù°í... ¾îµð¿¡ ¾ø´Ù°í ³ª¿À´ÂÁö À¯ÀÇÇؼ­ ºÃ´Â°¡? ./¿Í core://¿¡¼­ ã¾ÒÀ¸³ª ¾ø´Ù°í ³ª¿Â´Ù. ¹Ù·Î ±× À§Ä¡¿¡ Ŭ·¡½º°¡ Á¸ÀçÇØ¾ß ÇÑ´Ù. °á±¹ ÀÌ ¸Þ¼Òµå¸¦ ¾²¸é ´Ü¼øÈ÷ printlnÇÒ¶§º¸´Ù.. ³×ÀÌƼºê ÄÚµåÀÇ Å©±â°¡ 1MBÁ¤µµ Áõ°¡ÇÑ°ÍÀ» º¼ ¼ö Àִµ¥... Ŭ·¡½º¸¦ Çؼ®ÇÒ.. ÇÊ¿äÇÑ°Ô ¹ÙÀεù µÈ °ÍÀÏ °ÍÀÌ´Ù. ±× ¾Æ·¡ ÄÄÆÄÀÏµÈ Å¬·¡½º°¡ ÀÖ´Ù¸é... ±×·±µ¥ ±× ÄÄÆÄÀÏµÈ Å¬·¡½º´Â ¹ÙÀÌÆ®ÄÚµå·Î ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù. ¾Æ¹«Æ° ÀÖ´Ù¸é ±×°ÍÀ» Àоîµé¿©¼­ »ç¿ëÇÏ°Ô µÈ´Ù. === °£´ÜÇÑ ¿¹¸¦ ÅëÇØ ¾Ë¾Æº¸±â === ÀÌÁ¦ ¿¹¸¦ ÅëÇØ Á¶±Ý ´õ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ¾Æ·¡¿Í °°ÀÌ ÇÑ°³ÀÇ ÀÎÅÍÆäÀ̽º¿Í ±×°ÍÀ» ±¸ÇöÇÑ Å¬·¡½º ±×¸®°í »ç¿ëÇÒ Å¬·¡½º¸¦ ÁغñÇÑ´Ù. {{{#!vim java public interface forNameExamInterface { void test(); } }}} {{{#!vim java public class forNameExam implements forNameExamInterface { forNameExam() { System.out.println("forNameExample - initial"); } public void test() { System.out.println("forNameExample - test"); } } }}} {{{#!vim java public class ExamClassforName { public static void main(String[] args) { System.out.println("Class.forName Example"); try { Class ex = Class.forName("forNameExam"); forNameExamInterface obj = (forNameExamInterface)ex.newInstance(); obj.test(); } catch(Exception e) { System.out.println("error = "+e.toString()); } } } }}} ±×¸®°í MakefileÀº ´ÙÀ½°ú °°´Ù. {{{#!vim nosyntax OBJS = forNameExamInterface.o \ ExamClassforName.o CLASSES = forNameExam.class MAINCLASS = ExamClassforName all: $(CLASSES) $(OBJS) gcj --main=$(MAINCLASS) $(OBJS) -o $(MAINCLASS) forNameExamInterface.o : forNameExamInterface.java gcj -c forNameExamInterface.java -o forNameExamInterface.o ExamClassforName.o : ExamClassforName.java gcj -c ExamClassforName.java -o ExamClassforName.o forNameExam.class : forNameExam.java gcj -C forNameExam.java }}} ÀÚ! makeÇغ¸½Ã±â ¹Ù¶õ´Ù. Çغ¸¸é ¿ÀÇÁÁ§Æ® Äڵ尡 ´ã±ä ÆÄÀÏ µÎ°³, ³×ÀÌƼºê Äڵ尡 ´ã±ä ÆÄÀÏ Çϳª ±×¸®°í ¹ÙÀÌÆ® Äڵ尡 ´ã±ä ÆÄÀÏ Çϳª°¡ »ý¼ºµÈ´Ù. ½ÇÇàÇغ¸¸é ... ½ÇÇàÀÌ µÉ °ÍÀÌ´Ù... ÀÌ·± ¹æ¹ýÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð À§Ã³·³ ÇÏÁö ¾Ê°í ¹ÙÀÌÆ® ÄÚµå·Î »ý¼ºµÈ forNameExam¸¦ ¿ÀºêÁ§Æ® ÄÚµå·Î »ý¼ºÇؼ­.. ÇϳªÀÇ ½ÇÇàÆÄÀÏ¿¡ ¸µÅ©ÇÒ¶§ °°ÀÌ ¹­À» ¼öµµ ÀÖ´Ù. == GCJ¿¡¼­ GUI Çϱâ == GCJ´Â ÀÚ¹Ù API 1.2¿¡ ±âÁØÀ» µÐ API¸¦ Á¦°øÇÑ´Ù. ÇÏÁö¸¸ GCJ °ø½Ä ȨÆäÀÌÁö¿¡¼­ ¹àÈ÷°í ÀÖµíÀÌ ¸î¸î ÆÐÅ°Áö°¡ ºüÁ® ÀÖÀ¸¸ç ´ëÇ¥ÀûÀÎ °ÍÀÌ AWTÀÌ´Ù. µû¶ó¼­ GCJ·Î ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀ» ÇÏ·Á¸é GUI¿¡ À־ ¹®Á¦¸¦ °Þ°Ô µÉ ¼ö ÀÖ´Ù. ¹°·Ð GCJ User GroupÀÇ LINK¿¡ ¸µÅ©ÇصξúµíÀÌ XAWT°°Àº °Íµµ ÀÖ´Ù. ±×·¯ÇÑ ´ë¾ÈÀ¸·Î Eclipse¸¦ Á¦ÀÛÇϱâ À§ÇØ Eclipse ProjectÀÇ ÀϺηΠ°³¹ßµÈ SWT¸¦ GCJ·Î ºôµåÇؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ ±×·¸°Ô ÇÏ°í ÀÖ´Â »ç¶÷µéÀÌ ÀÖÀ¸¸ç ±×Á¡¿¡ ´ëÇؼ­´Â GCJ User GroupÀÇ Projects¿¡¼­ "JFace & SWT Native Library Build"¸¦ Âü°íÇϽñ⠹ٶõ´Ù. Àá½Ã ¾ð±ÞÀ» ÇÏÀÚ¸é ÇöÀç ÀÌ ±ÛÀ» ¾²°í ÀÖ´Â ½ÃÁ¡¿¡ 2.1À» ºôµåÇÑ °á°ú¹°Àº Ÿ »çÀÌÆ®¿¡¼­ º£Æ÷ÁßÀ̸ç.. GCJ User GroupÀÇ Project¿¡¼­´Â 3.0M6À» ºôµåÇßÀ¸¸ç ÀÌ´Â ¾ÆÁ÷ º£Æ÷ÇÏÁö ¾Ê°í ÀÖ´Ù. °èÁ¤ ¿ë·® °ü°è·Î ¸¶¶¥È÷ º£Æ÷ÇÒ ¸¸ÇÑ Àå¼Ò°¡ ¾ø¾î¼­ÀÌ´Ù. RefactorMe [http://java-gnome.sf.net JavaGnome]À» ÀÌ¿ëÇϸé GTK/GNOMEÀ» GUI·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. GNOME 2.6ºÎÅÍ´Â GnomePlatformBindingÀ̶ó´Â ÇüÅ·Π´Ù¸¥ ¾ð¾î·Î GNOME¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϱâ À§ÇÑ ¶óÀ̺긮·¯¸¦ ¹èÆ÷Çϴµ¥, C++, Perl°ú ÇÔ²² Java°¡ ±âº»À¸·Î Æ÷ÇԵǾî ÀÖ´Ù. --[iolo] === SWT¸¦ ºôµåÇϱâ === SWT3.0M6À» ±âÁØÀ¸·Î ¼³¸íÇÏ°Ú´Ù. ÀÏ´Ü ¼Ò½º¸¦ ¹Þ¾Æ¼­ µð·ºÅ丮¿¡ ¸ðµÎ Ç®¸é ´ë·« ÀÌ·± µð·ºÅ丮°¡ ³ª¿Â´Ù. org/eclipse/swt/... ¹Ù·Î ÆÐÅ°Áö°¡ ±×·¸°Ô µÇ±â ¶§¹®ÀÌ´Ù. ¾Æ¹«Æ° ÀÌ°É ¿°µÎÇØµÎ°í ºôµåÇÏ¸é µÈ´Ù. ÆÐÅ°Áö¸¦ ºôµåÇÏ´Â °ÍÀº JAVAÀÇ Package¸¦ ¶óÀ̺귯¸®·Î ¹­¾î »ç¿ëÇϱ⸦ Âü°íÇϱ⠹ٶõ´Ù. ¶ÇÇÑ JNI¿¡ ´ëÇÑ ³»¿ëµµ Âü°íÇϱ⠹ٶõ´Ù. SWT¶óÀ̺귯¸®´Â JNI¸¦ »ç¿ëÇÏ°í Àֱ⠶§¹®ÀÌ´Ù. ÇÏÁö¸¸ ±×³É ºôµåÇÏ¸é ¸î°¡Áö ¿¡·¯¸¦ ¸¸³ª°Ô µÈ´Ù. ±×·± ¿¡·¯¸¦ ÇØ°áÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ °£´ÜÈ÷ À̾߱âÇÏ°í ³Ñ¾î°¡°Ú´Ù. ´ÙÀ½ ÆÐÅ°ÁöÀÇ Å¬·¡½º¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. {{{#!vim nosyntax org.eclipse.swt.custom.TableCursor }}} ¿©±â¼­´Â »ó¼Ó¹ÞÀº Ŭ·¡½º¿Í ¸®ÅÏÇü¸¸ ´Ù¸£°Ô ¿À¹ö¶óÀ̵ù ÇÑ ¸Þ½îµåÀÎ traverse°¡ À־ ³ª¿À´Â ¿¡·¯ÀÌ´Ù. »ç½Ç ÀÌ°Ç JavaÀÇ ¹®¹ý¿¡µµ ¸ÂÁö ¾ÊÀ¸¸ç ¿¡·¯°¡ ¹ß»ýÇØ¾ß ¸ÂÀ¸³ª javac·Î´Â ÄÄÆÄÀÏÀÌ µÈ´Ù. ¾Æ¹«Æ° ´ÙÀ½Ã³·³ ¹Ù²Ù¸é µÈ´Ù. {{{#!vim nosyntax void traverse... ¡æboolean traverse... }}} ¹°·Ð À§Ã³·³ ÇØÁá´Ù¸é ¸®ÅÏ°ªµµ Á¤ÇØÁà¾ß ÇÑ´Ù´Â °ÍÀº ¸ðµÎ ¾Ë °ÍÀÌ´Ù. ±×¸®°í ´ÙÀ½ Ŭ·¡½º¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. {{{#!vim nosyntax org.eclipse.swt.custom.StyledText }}} À§ Ŭ·¡½º°¡ ÀÌ¹Ì Á¤ÀǵǾî ÀÖ´Ù°í ³ª¿Â´Ù. ±×·¯¸é¼­ ÀÌ¹Ì Á¤ÀÇµÈ À§Ä¡¸¦ ¾Ë·ÁÁִµ¥ StyledText¸¦ ¾Ë·ÁÁØ´Ù. ÀÌ°ÍÀº GCJÀÇ ¹ö±×ÀΰÍÀ¸·Î »ý°¢µÈ´Ù. ÇÏÁö¸¸ ´ÙÀ½Ã³·³ 1Â÷ÀûÀ¸·Î ¹ÙÀÌÆ® ÄÚµå·Î ÄÄÆÄÀÏ ÇÏ°í ÇÏ¸é µÈ´Ù. {{{#!vim nosyntax javac -classpath .\src src/org/eclipse/swt/custom/StyledText.java }}} ÀÌ µÎ°¡Áö¸¸ ÇØ°áÇϸé SWT¶óÀ̺귯¸®¸¦ ºôµåÇÒ ¼ö ÀÖ°Ô µÈ´Ù. === SWT¸¦ »ç¿ëÇÑ °£´ÜÇÑ ¿¹Á¦ === ÀÌÁ¦ ºôµå¸¦ Çß´Ù¸é ¾Æ¸¶ µÎ°¡ÁöÀÇ °á°ú¹°ÀÌ ÀÖ°Ô µÉ °ÍÀÌ´Ù. libswt.a swt.jar ±×¸®°í ´ÙÀ½ ¿¹Á¦¸¦ ÁغñÇÑ´Ù. {{{#!vim java import org.eclipse.swt.widgets.*; public class ExamSWT { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } } }}} ÄÄÆÄÀÏÀº ¾î¶»°Ô ÇØ¾ß Çϴ°¡? ´Ù¸¥ ±âº» ¹®¼­µéÀ» ÀоîºÃ´Ù¸é ¾Ë °ÍÀÌ´Ù. Ȥ½Ã ¸ð¸£½Ã°ÚÀ¸¸é ¾Õ¿¡ Àû¾ú´ø ¹®¼­¸¦ ´Ù½ÃÇѹø Âü°íÇϱ⠹ٶõ´Ù. ±×¸®°í ÄÄÆÄÀÏÀ» ÇÑ °á°ú¸¦ ½ÇÇàÇÏ·Á¸é ´ÙÀ½ÀÇ µÎ ÆÄÀÏÀÌ °°Àº µð·ºÅ丮 ¶Ç´Â Path¿¡ °É¸° µð·ºÅ丮¿¡ ÀÖ¾î¾ß ÇÑ´Ù. swt-awt-win32-3034.dll swt-win32-3034.dll À§ µÎÆÄÀÏÀº ¼Ò½º¸¦ ¹Þ¾Æ¼­ Á÷Á¢ ºôµå¸¦ ÇÒ ¼öµµ ÀÖÀ¸¸ç ºôµåµÈ °ÍÀ» ´Ù¿î¹ÞÀ» ¼öµµ ÀÖ´Ù. == GCJ¿¡¼­ Java Native Interface»ç¿ëÇϱâ == ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§ ÀÚ¹Ù ³»¿¡¼­ ÇØ°áÀÌ ¾î·Æ°Å³ª ºü¸¥ 󸮸¦ À§Çؼ­ JNI¶ó´Â Java Native Interface¸¦ »ç¿ëÇÑ´Ù. GCJ¿¡¼­µµ ÀÌ¿Í ºñ½ÁÇÑ ÇüÅ·ΠÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ´ÙÀ½ URL¿¡ ÀÖ´Â ¿¹Á¦¸¦ ÇÔ²² »ìÆ캸¸é¼­ GCJ¿¡¼­ ¾î¶»°Ô JNI¸¦ »ç¿ëÇÏ´ÂÁö »ìÆ캸ÀÚ. http://gcc.gnu.org/java/jni-comp.txt === JNI¸¦ À§ÇÑ ±âÃÊ === GCJ¿¡¼­´Â Sun»çÀÇ Java¿¡¼­Ã³·³ JNI¸¦ Á¦°øÇÑ´Ù. À̸¦ ÅëÇؼ­ GCJ¿¡ ÆÐÅ°Áö·Î Á¦°øµÇÁö ¾Ê´Â´Ù ÇÏ´õ¶óµµ ¹«¾ùÀ̵çÁö ÇÏ°íÀÚ ÇÏ´Â °ÍÀ» ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ JNI¿Ü¿¡µµ CNI¸¦ Á¦°øÇÑ´Ù. ¾ÆÁ÷ CNI¿¡ ´ëÇؼ­ ÇÊÀÚ´Â Á¦´ë·Î ¾Æ´Â ¹Ù´Â ¾øÁö¸¸ ¾î·ÅDzÇÑ ´À³¦¿¡ ÀÇÁ¸ÇØ À̾߱âÇÏÀÚ¸é µ¿Àû ¸µÅ© ¸ðµâÀÇ Çʿ伺 ¿©ºÎÀÌ´Ù. JNI¸¦ »ç¿ëÇÑ °æ¿ì¿¡´Â ¸®´ª½º¿Í °°Àº °æ¿ì¿¡´Â .so¶ó´Â ¸ðµâÀÌ À©µµ¿ìÁî°°Àº °æ¿ì¿¡´Â .dllÀ̶ó´Â ¸ðµâÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¹Ý¸é¿¡ CNI´Â ±×°ÍÀÌ ÇÊ¿ä ¾ø´Â µí ÇÏ´Ù. ÀÌ Á¡ÀÌ À߸øµÈ ³»¿ëÀ̶ó¸é Á¤Á¤ÇØÁֱ⠹ٶõ´Ù. ÀÏ´Ü ÀÌ·± µÎ°¡Áö ¹æ¹ýÀ» Á¦°øÇϱ⠶§¹®¿¡ GCJ¿¡¼­´Â ±âº»ÀûÀ¸·Î CNI¸¦ »ç¿ëÇÑ´Ù´Â °¡Á¤À» ÇÏ°í ÀÚ¹Ù ¼Ò½º Äڵ带 ÄÄÆÄÀÏÇÑ´Ù. ±×·¸±â ¶§¹®¿¡ JNI¸¦ »ç¿ëÇÏ´Â °æ¿ì ±×³É ÄÄÆÄÀÏÀ» ÇÏ¸é ¿¡·¯¸¦ ¹ß»ýÇÑ´Ù. µû¶ó¼­ º°µµÀÇ ¿É¼ÇÀÌ ÇÊ¿äÇÏ´Ù. ¹Ù·Î -fjniÀÌ´Ù. ÀÌ°ÍÀº jni¸¦ »ç¿ëÇÏ´Â swt¸¦ ºôµåÇÒ¶§µµ »ç¿ëµÇ¾ú´Ù. JNI¸¦ »ç¿ëÇÏ·Á´Â ÀÚ¹Ù ¼Ò½º Äڵ尡 ÀÖ´Ù¸é ´ÙÀ½Ã³·³ ÄÄÆÄÀÏÇÑ´Ù. {{{#!vim nosyntax gcj -fjni -o sample sample.java }}} ¶ÇÇÑ Çì´õ ÆÄÀÏÀ» »ý¼ºÇÏ´Â °ÍÀÌ Á¦°øµÈ´Ù. Sun»çÀÇ Java¿¡¼­´Â javah¶ó´Â µµ±¸°¡ Á¦°øµÇ¾ú´Ù. GCJ¿¡¼­´Â gcjh¶ó´Â µµ±¸°¡ Á¦°øµÈ´Ù. Äֿܼ¡¼­ ´ÙÀ½Ã³·³ ¸í·ÉÀ» ³»·Á Çì´õ ÆÄÀÏÀ» »ý¼ºÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. {{{#!vim nosyntax gcjh -jni sample }}} ÀÌ·¸°Ô Çϸé sample.h°¡ »ý¼ºµÈ´Ù. ±×·±µ¥ À̶§ »ý°¢Çغ¸¾Æ¾ß ÇÒ°ÍÀº gcjhÀÇ µµ¿ò¸»À» ½ÇÇàÇغ¸¸é ¾Ë ¼ö ÀÖ°ÚÁö¸¸ ÀÌ°ÍÀº .classÆÄÀϷκÎÅÍ Çì´õ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. µû¶ó¼­ ÀÌ¹Ì À§¿Í°°Àº °æ¿ì sample.class°¡ Á¸ÀçÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù. ±×¸®°í sample.h¿¡ ¸Â°Ô ±¸ÇöÀ» ÇÏ¿´´Ù¸é ±×°ÍÀ» µ¿Àû ¸µÅ© ¸ðµâ·Î ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. ¹æ¹ýÀº gcc·Î ÇÁ·Î±×·¡¹Ö ÇÒ¶§¿Í °°´Ù. {{{#!vim nosyntax gcc -c sampNat.c gcc -shared -o sampNat.dll sampNat.o }}} ¿©±â¿¡ .dll·Î µÇ¾î Àִ°ÍÀº ÇÊÀÚ°¡ µ¥½ºÅ©Å¾À¸·Î ¸®´ª½º°¡ ¾Æ´Ñ À©µµ¿ìÁ ¾²°í Àֱ⠶§¹®ÀÌ´Ù. ¹°·Ð À§ÀÇ URL·Î °¡¸é ¸®´ª½º¿ë ¿¹Á¦¸¦ ¸¸³¯ ¼ö ÀÖ´Ù. ¾Æ¹«Æ° ÀÌÂëµÇ¸é ¾Æ·¡ ¿¹Á¦°¡ ¸ðµÎ ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ´Ù½ÃÇѹø ¾ð±ÞÇÏÁö¸¸ ÇÊÀÚ´Â À§ÀÇ URLÀÇ ¿¹Á¦¸¦ À©µµ¿ìÁî¿¡¼­ »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¾à°£ÀÇ ¼öÁ¤À» ÇÏ¿´´Ù. === °£´ÜÇÑ ¿¹Á¦ === °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ. À§ÀÇ URL¿¡¼­ ±×´ë·Î º¹»çÇؼ­ À©µµ¿ìÁîÀÇ Mingw¿¡¼­ »ç¿ë °¡´ÉÇϵµ·Ï ¾à°£ ¼öÁ¤À» Çß´Ù. °ÅÀÇ °°´Ù°í º¸¾Æµµ ¹«¹æÇÏ´Ù. ''sample.java'' {{{#!vim java public class sample { public native void myNative(String s); public void myJava(String s) { s = s + ", Java"; System.out.println(s); } public static void main(String args[]) { sample x = new sample(); x.myJava("Hello"); x.myNative("Hello, Java (from C)"); x.myJava("Goodbye"); } static { System.loadLibrary("sampNat"); } } }}} ¿¹Á¦¸¦ º¸¸é ¸Ç À§¿¡ Native Method¸¦ »ç¿ëÇϱâ À§ÇØ ¼±¾ðÀ» ÇÏ¿´´Ù. gcjh´Â ÀÌ°ÍÀ» ±Ù°Å·Î header¸¦ »ý¼ºÇÑ´Ù. ±×¸®°í ¾Æ·¡ System.loadLibrary("sampNat")¶ó°í ÇÏ¿© µ¿ÀûÀ¸·Î ¸ðµâÀ» ·ÎµùÇÏ°Ô ÇÏ¿´´Ù. ''sampNat.c'' {{{#!vim c #include #include "sample.h" #include JNIEXPORT void JNICALL Java_sample_myNative (JNIEnv *env, jobject this, jstring s) { jclass cls; jfieldID fid; jobject obj; jmethodID mid; printf("From C\n"); cls = (*env)->FindClass(env, "java/lang/System"); if (cls == 0) { printf("java/lang/System lookup failed\n"); return; } fid = (*env)->GetStaticFieldID(env, cls, "out", "Ljava/io/PrintStream;"); if (fid == 0) { printf("java/lang/System::out lookup failed\n"); return; } obj = (*env)->GetStaticObjectField(env, cls, fid); if (obj == 0) { printf("GetStaticObjectField call failed\n"); return; } cls = (*env)->GetObjectClass(env, obj); if (cls == 0) { printf("GetObjectClass(out) failed\n"); return; } mid = (*env)->GetMethodID(env, cls, "println", "(Ljava/lang/String;)V"); if (mid == 0) { printf("println method lookup failed\n"); return; } (*env)->CallVoidMethod(env, obj, mid, s); } }}} º¸¸é ¾Ë ¼ö ÀÖµíÀÌ À§ÀÇ sampleŬ·¡½º·ÎºÎÅÍ »ý¼ºµÈ Çì´õ¸¦ ±¸ÇöÇÏ°í ÀÖ´Ù. ¿©±â¿¡ »ý¼ºµÈ Çì´õÆÄÀÏÀº Æ÷ÇÔÇÏÁö ¾Ê¾ÒÁö¸¸ »ý¼ºµÈ ¸ð½ÀÀ» ¿­¾î¼­ È®ÀÎÇغ¸±â ¹Ù¶õ´Ù. ÀÌ·¸°Ô Çß´Ù¸é ºôµåÇÏ´Â ÀÏÀÌ ³²¾Ò´Ù. À§ÀÇ URL¿¡¼­´Â MakefileÀ» ÀÌ¿ëÇÏ°í ÀÖ´Ù. ÇÊÀÚ´Â ±×³É ºôµå¿¡ ÇÊ¿äÇÑ ¼ø¼­´ë·Î ³ª¿­Çغ¸µµ·Ï ÇÏ°Ú´Ù. {{{#!vim nosyntax gcj -C sample.java gcjh -jni sample gcc -c sampNat.c -o sampNat.o gcc -shared -o sampNat.dll sampNat.o gcj -fjni -o sample sample.class --main=sample }}} ù¹ø° ÁÙÀº sample.java¸¦ ¹ÙÀÌÆ® ÄÚµå·Î ÄÄÆÄÀÏ ÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½ µÎ¹ø° ÁÙÀº ±× »ý¼ºµÈ ¹ÙÀÌÆ® ÄÚµå·ÎºÎÅÍ Çì´õÆÄÀÏÀ» ¾ò´Â´Ù. ¼¼¹ø°ÁÙÀº ±×°ÍÀ» ±¸ÇöÇÏ°í ÀÖ´Â sampNat.c¸¦ ¿ÀºêÁ§Æ® ÄÚµå·Î ÄÄÆÄÀÏÇÏ°í ÀÖ´Ù. ±×¸®°í ³×¹ø°ÁÙ¿¡¼­ µ¿Àû ¸µÅ© ¸ðµâÀ» ¸¸µé°í ¸¶Áö¸·À¸·Î ¹ÙÀÌÆ® ÄÚµå·Î ÄÄÆÄÀÏµÈ Å¬·¡½º¸¦ ³×ÀÌƼºê ÄÚµå·Î ÄÄÆÄÀÏÇÑ´Ù. ±×¸®°í »ý¼ºµÈ sampleÀ» ½ÇÇà½ÃÄѺ¸¶ó. ¸ÚÁö°Ô ½ÇÇàµÉ °ÍÀÌ´Ù. == ÃÖÀûÈ­·Î ¼º´É Çâ»ó½ÃÅ°±â == GCCÀÇ ÃÖÀûÈ­ ¿É¼ÇµéÀ» GCJ¿¡¼­µµ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. {{{#!vim nosyntax # gcj -Os -s -march=pentium2 --main=Hello Hello.o }}} ÀÚ¼¼ÇÑ ³»¿ëÀº [GccOptimizationOptions]À» Âü°íÇÒ °Í. == ½ÇÇà ÆÄÀÏ Å©±â ÁÙÀ̱â == GCJ·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇßÀ» ¶§ÀÇ °ñÄ©°Å¸® Áß Çϳª´Â, ÃÖÁ¾ ½ÇÇà ÆÄÀÏÀÇ Ä¿´Ù¶õ Å©±âÀÌ´Ù. ÇÊÀÚ´Â SWT¸¦ ÀÌ¿ëÇؼ­ Text À§Á¬¿¡ 'Hello World'¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾ú´Âµ¥, ±× Å©±â´Â Àڱ׸¶Ä¡ 48.2M³ª µÇ¾ú´Ù. ÀÌ°ÍÀº º¸ÅëÀÇ JRE ·Îµù¿¡ ÇÊ¿äÇÑ °¡ºñÁö Ä÷ºÅÍ¿Í ¼ö¹é°³ÀÇ Å¬·¡½º ÆÄÀÏÀ» ³»ÀåÇÔÀ¸·Î½á »ý±ä °á°ú·Î, ÀÛÀº ÇÁ·Î±×·¥¿¡°Ô´Â Áö³ªÄ¡°Ô ºñ´ëÇÑ ¿ë·®ÀÌ´Ù. === srtipÀ» ÀÌ¿ëÇÑ ¹æ¹ý === stripÀº ¹ÙÀ̳ʸ®¿¡¼­ ºÒÇÊ¿äÇÑ µð¹ö±ë ½Éº¼µéÀ» Á¦°ÅÇØÁØ´Ù. À©µµ¿ì À¯Àú¶ó¸é mingw/binutils°¡ ÇÊ¿äÇѵ¥, ÇÊÀÚ´Â [http://javacompiler.mtsystems.ch javacompiler] ÆÐÅ°Áö¿¡ ³»ÀåµÈ °ÍÀ» »ç¿ëÇß´Ù. »ç¿ë¹ýÀº ¸Å¿ì °£´ÜÇÏ´Ù. {{{#!vim nosyntax # strip Foo.exe }}} À§¿¡¼­ ¾ð±ÞÇÑ ¹ÙÀ̳ʸ®ÀÇ °æ¿ì, ±× Å©±â°¡ 14.7M Á¤µµ·Î ÁÙ¾îµé¾ú´Ù. === gcjÀÇ ¿É¼ÇÀ» ÀÌ¿ëÇÑ ¹æ¹ý === gcj·Î ÄÄÆÄÀϽà -s ¿É¼ÇÀ» ÁÖ¸é ½Éº¼µéÀÌ Á¦°ÅµÇ°í ¿ë·®ÀÌ ÁÙ¾îµç´Ù. {{{#!vim nosyntax # gcj -s --main=bar.Foo *.o Foo }}} ÀÌ °æ¿ì ¿ë·®Àº À§¿¡¼­ stripÀ» »ç¿ëÇßÀ» ¶§¿Í µ¿ÀÏÇÏ´Ù. ´Ü, óÀ½ ¿ÀºêÁ§Æ® Äڵ带 »ý¼º½Ã¿¡´Â -s ¿É¼ÇÀÌ ºÒÇÊ¿äÇÏ´Ù. Àû¿ëµÇÁöµµ ¾ÊÀ» »Ó´õ·¯, stripÀ» ½á¼­ °­Á¦·Î ¿ë·®À» ÁÙÀ̸é ÈÄ¿¡ gcj¿¡¼­ »ç¿ë½Ã ÆÐÅ°Áö¸¦ ãÀ» ¼ö ¾ø´Ù´Â ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. {{{#!vim nosyntax # gcj -s Bar.java //-s È¿°ú¾øÀ½ # gcj -s --main=Foo *.o Foo # strip Bar.o # gcj -s --main=Foo *.o Foo //Bar.o ¾ÈÀÇ ÆÐÅ°Áö¸¦ ãÀ» ¼ö ¾ø´Ù´Â ¿¡·¯ }}} === ¶óÀ̺귯¸® »ç¿ëÇϱâ === ¿ÀºêÁ§Æ® ÄÚµå(*.o) ´ë½Å ¶óÀ̺귯¸®(*.a)¸¦ »ç¿ëÇÏ¸é »ç¿ëµÇÁö ¾Ê´Â Ŭ·¡½º´Â Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ¾ð±ÞÇÑ HelloWorld ÄÄÆÄÀϽà ¿ë·® Â÷ÀÌ´Â 1MB ¹Ì¸¸À¸·Î ¸Å¿ì ¹Ì¹ÌÇßÁö¸¸, ±Ô¸ð°¡ Ä¿Áú ¼ö·Ï µµ¿òÀÌ µÉ °ÍÀÌ´Ù. Ŭ·¡½º·Î´õ µî ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇÏ´Â °æ¿ì´Â gcj°¡ ¸ðµç Ŭ·¡½ºÀÇ »ç¿ëÀ» °¨ÁöÇÏÁö ¸øÇØ ½ÇÇàÁß ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ÁÖÀDZí°Ô »ç¿ëÇϵµ·Ï ÇÑ´Ù. === libgcj.dll ¸¸µé±â === gcj¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¥À» ¿©·µ ¸¸µå´Â °æ¿ì, libgcj¸¦ º°µµ·Î ¸ðµâÈ­ÇÏ¿© ¿ë·®À» Å©°Ô ÁÙÀÏ ¼ö ÀÖ´Ù. ´ÙÀ½ ¹®¼­µéÀ» Âü°íÇ϶ó. * [http://gcc.gnu.org/ml/java/2002-12/msg00287.html A working libgcj.dll] * [http://www.rcode.net/blog/tlaurenzo/2005/08/19/building-libgcjdll-for-mingw-with-gcc-41/ Building libgcj.dll for MinGW with GCC 4.1] °¡´ÉÇÏ´Ù¸é java.awt.*, javax.swing.* µîÀÇ ÆÐÅ°Áö¸¦ Á¦°ÅÇÏ´Â °Íµµ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. === UPX¸¦ ÀÌ¿ëÇÑ ¹æ¹ý === [http://upx.sf.net UPX]¸¦ »ç¿ëÇÏ´Â °Íµµ ÇϳªÀÇ ¹æ¹ýÀÌ´Ù. ¾ÐÃà ¼Óµµ°¡ ¸Å¿ì ºü¸£¸ç ½ÇÇà ¼Óµµ¿¡µµ °ÅÀÇ ¿µÇâÀ» ¹ÌÄ¡Áö ¾ÊÁö¸¸, ´ë½Å ¸Þ¸ð¸® Á¡À¯À²ÀÌ ¾ÐÃàÀü ÆÄÀÏÀÇ ¿ë·®¸¸Å­ ´Ã¾î³­´Ù. »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù. {{{#!vim nosyntax # upx -1 -o CompressedFoo.exe FatFoo.exe }}} ¼ýÀÚ ¿É¼ÇÀº 1¿¡¼­ 9±îÁö·Î ¾ÐÃà·üÀ» ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç ¾ÐÃà·üÀÌ ¿Ã¶ó°¥¼ö·Ï ±×¸¸Å­ ¼Óµµµµ ´À·ÁÁø´Ù. ´ÙÀ½Àº ¾Õ¼­ ¾ð±ÞÇÑ ÇÁ·Î±×·¥À» UPX¸¦ »ç¿ëÇØ ¾ÐÃàÇÑ °á°úÀÌ´Ù. ºñ±³Àû Àú»ç¾çÀÎ ¼¿400MHz¿¡ 256M ·¥, ÄöÅÒ ÆÄÀ̾ 6G HDD¸¦ »ç¿ëÇß´Ù. || ¿É¼Ç || ¼Ò¿ä½Ã°£ || ÃÖÁ¾ Å©±â || || -1 || 7ÃÊ || 21.1M || || -5 || 4ºÐ 11ÃÊ || 17.2M || || -9 || 11ºÐ 21ÃÊ || 15.4M || °¡Àå ºü¸¥ ¾ÐÃà¿¡¼­Á¶Â÷ ½ÇÇà ÆÄÀÏÀÇ Å©±â°¡ Àý¹Ý ÀÌÇÏ·Î ÁÙ¾îµç °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. == GCJ Bug & Patch == * [http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13212 AttachCurrentThread() not working] - ½Ã½ºÅÛÆ®·¹À̸¦ ÀÚ¹Ù¿¡¼­ »ç¿ëÇÏ·Á´Ù ¹ß°ßÇÑ°ÍÀÔ´Ï´Ù. ÇöÀç systray4j¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú swtÀÇ TrayIconÆÐÄ¡¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ Àִµ¥ systray4j¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÌ ¹ö±×¶§¹®¿¡ Àß ¾ÈµÇ´Â±º¿ä :) ---- '''¹®¼­ ÀÏÁö''' * ÆäÀÌÁö óÀ½ ¸¸µê: [ÀÌÇѱæ] * ÆÐÅ°Áö, Class.forName, SWT, JNI¿¡ ´ëÇØ Ãß°¡. GCJ User GroupÀ» ´ÝÀ¸¸ç ±×´ë·Î ¿Å°Ü¿È. - [ÀÌÇѱæ] * KLDPÀÇ ¼­¹ö ÀÌ»óÀ¸·Î ¼Õ½ÇµÈ ÀڷḦ °³ÀÎÀûÀ¸·Î º¸°üÇÏ´ø ¹®¼­·Î º¹¿øÇÔ(2006³â 2¿ù 17ÀÏ) - [ÀÌÇѱæ] (µåµð¾î º¹¿øÇß½À´Ï´Ù. ÀÌ Á¤µµ ¹®¼­¸é ½±°Ô ÀÔ¹®ÇÒ ¼ö ÀÖÀ» °Å¶ó°í »ý°¢ÇÕ´Ï´Ù.) * '¹ÙÀÌÆ®ÄÚµå·ÎºÎÅÍ ÄÄÆÄÀÏ', '½ÇÇà ÆÄÀÏ ¾ÐÃàÇϱâ' Ãß°¡(2006³â 8¿ù 27ÀÏ) - [netisinfinite] * ¸î°¡Áö Å©±â ¹× ÃÖÀûÈ­¿¡ ´ëÇÑ ³»¿ëÀ» ´õÇÔ(2006³â 9¿ù 17ÀÏ) - [netisinfinite] ---- '''See Also''' * ±¸ÇöµÈ ÆÐÅ°Áöµé¿¡ ´ëÇÑ ¼³¸í * http://gcc.gnu.org/java/status.html * http://japi.sab39.org/ * http://gcc.gnu.org/java/libgcj-classpath-compare.html * GUIÁö¿ø ÇÁ·ÎÁ§Æ® * [http://swingwt.sourceforge.net/ SwingAPI¸¦ SWT¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöÇÏ´Â ÇÁ·ÎÁ§Æ®] * [http://www.xwt.org/ XWT] * CNI¿¡ ´ëÇÑ ÀÚ·á * [http://gcc.gnu.org/onlinedocs/gcc-3.3.2/gcj/About-CNI.html CNI¸¦ ¼³¸íÇÏ´Â GCJ¸Þ´º¾ó] * ±×·¡ÇÈ ÅøŶ * [http://xawt.sourceforge.net/ XAWT] ---- from wiki.kldp.org by me