· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
GCJ

  • Gnu Compiler for JavaÀÇ ¾àÀÚ. java·Î ¾º¿©Áø Äڵ带 Native Code·Î ¹Ù²ãÁÖ´Â ÄÄÆÄÀÏ·¯

1. ±âº»ÀûÀÎ »ç¿ë

1.1. »ç¿ëȯ°æ

GCJ´Â gccÀÇ ÀϺÎÀ̱⠶§¹®¿¡ gcc¸¦ »ç¿ëÇÒ ¼ö Àִ ȯ°æÀÌ µÇ¾î¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¸®´ª½º¿¡¼­´Â »ç¿ëÀÌ °¡´ÉÇϸç À©µµ¿ìÁî¿¡¼­ http://www.mingw.org ¿¡¼­ Á¦°øÇÏ´Â °ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

1.2. °£´ÜÇÑ ¿¹Á¦

public class ExamGCJ {
         public static void main(String[] args) {
                  System.out.println("ExamGCJ Class GCJ Test");
         }
}
À§¿Í °°Àº ¿¹Á¦¸¦ °¡Áö°í Çغ¸ÀÚ. ¸ÕÀú À§¿Í °°Àº ÆÄÀÏÀ» Çϳª ÀÛ¼ºÇÏ°í ÆÄÀÏ À̸§À» ExamGCJ.java·Î Çؼ­ ÀúÀåÇÑ´Ù. ±×¸®°í ´ÙÀ½°ú °°Àº ¸í·ÉÁÙÀ» ÅëÇؼ­ GCJ·Î ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù.
# gcj --main=ExamGCJ ExamGCJ.java -o ExamGCJ
ÀÌ·¸°Ô Çϸé ExamGCJ¶ó´Â Native Code¸¦ ´ãÀº ½ÇÇà ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. GCC¿¡ Àͼ÷ÇÏ´Ù¸é ¹Ù·Î ¾Ë ¼ö ÀÖµíÀÌ GCJ¿¡¼­ ¿ª½Ã gcc¿Í ºñ½ÁÇÑ ¿É¼ÇÀÌ »ç¿ëµÈ´Ù.

  • -o À̸§ ÁöÁ¤
  • -c object code¸¸ »ý¼º

1.3. µÎ°³ ÀÌ»óÀÇ Å¬·¡½º·Î ÀÌ·ç¾îÁø ÄÚµå ÄÄÆÄÀÏ

public class ExamGCJ {
         public static void main(String[] args) {
                  System.out.println("Two Class GCJ Test");
                  new LibExamGCJ();
         }
}

public class LibExamGCJ {
         LibExamGCJ() {
                  System.out.println("Two Class GCJ Test --- this is print in lib");
         }
}
À§ÀÇ Äڵ带 °¢ Ŭ·¡½º À̸§À» ÆÄÀÏ À̸§À¸·Î ÇÏ¿© µÎ°³ÀÇ ÄÚµå ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù. ±×¸®°í ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù.
# gcj -c LibExamGCJ.java
# gcj -c ExamGCJ.java
# gcj --main=ExamGCJ ExamGCJ.o LibExamGCJ.o -o ExamGCJ
À§¿¡¼­ºÎÅÍ ÀÚ²Ù º¸ÀÌ°ÚÁö¸¸ --mainÀ̶ó´Â ¿É¼ÇÀÌ ÀÖ´Ù. ÀÌÂë µÇ¾úÀ¸¸é ÀÌ ¿É¼ÇÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö ÀÌÇØÇßÀ¸¸®¶ó »ý°¢ÇÑ´Ù ¹Ù·Î mainÀ̶ó´Â ¸Þ¼Òµå°¡ Àִ Ŭ·¡½ºÀÇ À̸§À» ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. À̸¦ ÁöÁ¤ÇØÁÖÁö ¾Ê°í ÄÄÆÄÀÏÀ» Çغ¸±â ¹Ù¶õ´Ù. ºÐ¸í ¿¡·¯¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.

1.4. ¹ÙÀÌÆ®ÄÚµå·ÎºÎÅÍ ÄÄÆÄÀÏ

ÄÄÆÄÀÏ ÇÒ ¶§ .java ´ë½Å .class ÆÄÀÏÀ» ³Ö¾îÁÖ¸é ÄÄÆÄÀÏµÈ ¹ÙÀÌÆ® ÄÚµå·ÎºÎÅÍ ÄÄÆÄÀÏÀÌ °¡´ÉÇÏ´Ù.
# gcj -c LibExamGCJ.class
ÀÌ°ÍÀÌ ¿Ö ÇÊ¿äÇÒ±î? ÇöÀç gcj´Â java 5ÀÇ ¸î°¡Áö Çâ»óµÈ ±¸¹®À» ÀνÄÇÏÁö ¸øÇÑ´Ù.
ForeachExam.java:16: error: Invalid declaration.
                for(File f : fileList){
                              ^
À̶§ jdk 1.5ÀÇ javac·Î ¸ÕÀú ¹ÙÀÌÆ®ÄÚµå·Î º¯È¯ÇÑ µÚ gcj¿¡¼­ ÄÄÆÄÀÏÇÏ¸é ¹®Á¦¾øÀÌ »ç¿ëÀÌ °¡´ÉÇÏ´Ù.

1.5. ¶óÀ̺귯¸®·Î ¹­¾î¼­ »ç¿ëÇϱâ

ºÐ¸í ¾î¶² ¾ð¾î·Î ÇÁ·Î±×·¡¹ÖÀ» ÇϵçÁö ÀÚÁÖ ¾²´Â Äڵ带 ¹­¾îµÎ°í »ç¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. GCJ¿¡¼­µµ ÀÚÁÖ »ç¿ëÇÏ´Â Äڵ带 ¹­¾îµÎ°í ÇÊ¿äÇÒ¶§ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù. GCJ´Â GCCÀÇ ÀϺδÙ. µû¶ó¼­ GCCó·³ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.

ÇÊÀÚ´Â ¸®´ª½º¸¦ ÀÚÁÖ »ç¿ëÇÏÁö ¾Ê´Â´Ù. µû¶ó¼­ ¿©±âÀÇ ¼³¸íÀÌ À©µµ¿ìÁîÀÇ MinGW¿¡¼­ÀÇ ÀÛ¾÷¿¡ ÃÊÁ¡ÀÌ ¸ÂÃß¾îÁ® ÀÖ´Ù´Â °ÍÀ» Âü°íÇϱ⠹ٶõ´Ù.
# ar -crs libexam.a LibExamGCJ.o
ÀÌ·¸°Ô Çϸé ÀÌ¹Ì »ý¼ºÇÑ ¿ÀºêÁ§Æ® Äڵ带 ¶óÀ̺귯¸®·Î Æ÷ÇÔ½ÃŲ´Ù. ¿ÀºêÁ§Æ® ÄÚµåÀÇ »ý¼ºÀº ¾Õ¿¡¼­ ¼³¸íÀ» Ç߱⿡ »ý·«ÇÑ´Ù.

¾Æ¹«Æ° ÀÌ·¸°Ô »ý¼ºÇÑ °ÍÀ» °°ÀÌ ¸µÅ©ÇÏ¸é µÇ´Âµ¥ ±×°Í¿ª½Ã GCC¿Í µ¿ÀÏÇÏ´Ù.
# gcj --main=ExamGCJ ExamGCJ.o -L.\ -lexam
´ë·« ÀÌ·±½ÄÀ̶ó°í Àû¾îµÎ¸é ÀÌÇظ¦ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ExamGCJ¿Í LibExamGCJ¶ó´Â µÎ°³ÀÇ Å¬·¡½º´Â ÀÓÀÇ·Î ¸¸µé¾î Å×½ºÆ®Çغ¸±â ¹Ù¶õ´Ù. ÇÏÁö¸¸ ÀÌ·±½ÄÀ¸·Î ÇÒ ¶§ ÇÑ°¡Áö ¹®Á¦´Â ExamGCJ.o¸¦ »ý¼ºÇϱâ À§ÇØ GCJ·Î ºôµåÇÒ ¶§ Ŭ·¡½ºÀÇ ÇüŸ¦ ¾Ë¾Æ¾ß.. LibExamGCJ¶ó´Â Ŭ·¡½º¸¦ »ç¿ëÇÒ ¶§ ¿¡·¯¸¦ üũÇϴµ¥ À־ ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù.

µû¶ó¼­ LibExamGCJ¿Í °°ÀÌ ¶óÀ̺귯¸®·Î ¹­À» ¼Ò½º ÄÚµå´Â ¹ÙÀÌÆ® ÄÚµå·Îµµ »ý¼ºÇؼ­ Jar·Î ¹­¾îµÎ°í ÀÌ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â °æ¿ì¿¡ Ŭ·¡½º Æнº¿¡ Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ ÁÁ´Ù.
# gcj -C LibExamGCJ.java
# jar cf swt.jar LibExamGCJ.class
ÀÌ·± ¹æ¹ýÀ¸·Î °³¹ßÀ» Á»´õ ÆíÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ¹Ì Á¸ÀçÇÏ´Â ÆÐÅ°Áö¸¦ ºôµåÇؼ­ »ç¿ëÇϴµ¥ À¯¿ëÇÏ´Ù.

2. ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®È­ Çϱâ

GCJ´Â ÁÖ·Î Native Code¸¦ »ý¼ºÇϱâ À§ÇØ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯À̱⠶§¹®¿¡ ÀÚ¹Ù·Î ÀÌ·ç¾îÁø ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®È­ÇÏ¿© ¸µÅ©ÇÏ´Â °ÍÀÌ ¿øÇÒÇÑ °³¹ßÀ» À§ÇØ ¹Ù¶÷Á÷ÇÏ´Ù. ƯÈ÷ ¸µÅ©ÇÒ¶§ ¿ÀºêÁ§Æ®ÄÚµå(.o)´Â »ç¿ëÇÏÁö ¾Ê¾Æµµ °°ÀÌ ¹­Áö¸¸ Á¤Àû¸µÅ©¶óÀ̺귯¸®(.a)´Â ÇÊ¿äÇÑ °Í¸¸ ¹­¾îÁö¹Ç·Î ¶óÀ̺귯¸®È­ Çؼ­ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±×·¯¸é ±× ¹æ¹ýÀ» ÇϳªÀÇ ¿¹Á¦¿Í ÇÔ²² °£´ÜÈ÷ ¼Ò°³ÇÏ°íÀÚ ÇÑ´Ù.

2.1. ÆÐÅ°Áö ¾ÈÀÇ ¿ÀºêÁ§Æ®ÄÚµåÀÇ À̸§Àº ¾î¶»°Ô Á¤ÇØÁö´Â°¡?

ÆÐÅ°ÁöÀÇ ±¸¼ºÀ» º¸¸é º¸Åë ÀÌ·± ÇüÅ·ΠµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

java.util.Vector

À§¿¡ º¸¸é ¾Ë ¼ö ÀÖµíÀÌ java.util ÆÐÅ°ÁöÀÇ VectorŬ·¡½ºÀÌ´Ù. ±×¸®°í ¼Ò½º ÄÚµå ³»¿¡¼­ »ç¿ëÇÏ·Á¸é ´ÙÀ½Ã³·³ import¸¦ ÇÑ´Ù.

import java.util.Vector

¹°·Ð GCJ·Î ÄÄÆÄÀÏ ÇÒ ¼Ò½ºµµ ¶È°°ÀÌ ÇÑ´Ù. ±×·³ ÀÌ°ÍÀ» »ç¿ëÇÑ Äڵ带 ¸µÅ©ÇÒ¶§´Â ¾î¶² À̸§À» °¡Áø ¿ÀÇÁÁ§Æ®°¡ ÇÊ¿äÇÑ°¡? ¹Ù·Î ´ÙÀ½°ú °°Àº À̸§À» °¡Áø ¿ÀºêÁ§Æ® Äڵ尡 ÇÊ¿äÇÏ°Ô µÈ´Ù. ¶óÀ̺귯¸® ¾È¿¡¼­ À̾߱âÀÌ´Ù.

java_util_Vector.o

±×¸®°í ½ÇÁ¦·Î libgcj.a¾È¿¡ Á¸ÀçÇÑ´Ù. ¾Æ¹«Æ° ±×·¸°Ô ¶óÀ̺귯¸®¸¦ ¸¸µé¾îµÎ°í ÇÊ¿äÇÒ¶§¸¶´Ù... Áï ÇØ´ç ÆÐÅ°Áö¸¦ »ç¿ëÇÒ¶§¸¶´Ù ¿ÀÇÁÁ§Æ® Äڵ尡 ¾Æ´Ñ ¶óÀ̺귯¸®¸¦ ¸µÅ©Çؼ­ »ç¿ëÇÏ¸é µÈ´Ù.

2.2. °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇؼ­ ÀÌÇØÇϱâ

ÀÌÁ¦ °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇؼ­ ÀÌÇØÇØ º¸ÀÚ. ÀÌÂëµÇ¸é ¾ÕÀÇ "GCJÀÇ °£´ÜÇÑ ¼Ò°³"¿¡¼­´Â »ç¿ëÇÏÁö ¾Ê¾ÒÁö¸¸ MakefileÀ» »ç¿ëÇÏ´Â°Ô ÆíÇÒ °ÍÀÌ´Ù. ¹°·Ð GCC¸¦ »ç¿ëÇϽô ºÐµéÀº ´ç¿¬È÷ ¹Þ¾Æµé¿©Áö°ÚÁö¸¸ JAVA¸¸ ÇϽôø ºÐµéÀº Á¶±Ý ¾î»öÇϽÇÁöµµ ¸ð¸¥´Ù. º¸Åë ÀÚ¹Ù·Î ÇÁ·Î±×·¡¹ÖÀ» Çϸé Apache ProjectÀÇ Ant°¡ ±× ºñ½ÁÇÑ ¿ªÇÒÀ» Çϱ⠶§¹®¿¡ Ant°¡ Àͼ÷ÇÒ °ÍÀÌ´Ù.

¾Æ¹«Æ° ÀÌÁ¦ ¿ì¸®´Â GCC(Gnu Compiler Collection)À» »ç¿ëÇÏ´Ï Gnu Make ToolÀÎ MakefileÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. ±×¸®°í MakefileÀÇ º¹ÀâÇÑ °ÍÀº ¸ðµÎ Á¦¿ÜÇÏ°í ²À ÇÊ¿äÇÑ ´Ü¼øÇÑ °Í¸¸ »ç¿ëÇÒ °ÍÀ̹ǷΠ°ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. Ȥ½Ã Makefile¿¡ ´ëÇÑ ³»¿ëÀ» ¸ð¸£½Å´Ù¸é kldp.org¿¡¼­ ã¾Æ¼­ °¡º±°Ô Àо±â ¹Ù¶õ´Ù.

±×·³ ÀÌÁ¦ ½ÃÀÛÇϵµ·Ï ÇÏ°Ú´Ù. ¸ÕÀú µð·ºÅ丮 ±¸¼ºÀ» °£´ÜÈ÷ »ìÆ캸ÀÚ. Á¸ÀçÇÏ´Â µð·ºÅ丮´Â ´ÙÀ½°ú °°´Ù.

./bin
./obj
./lib
./src
ÀÌ·¸°Ô ³×°³Àε¥... ./src µð·ºÅ丮 ¾Æ·¡ ¼Ò½º¸¸ Á÷Á¢ ÀÛ¼ºÀ» ÇÏ°í ³ª¸ÓÁö µð·ºÅ丮´Â... Make¸¦ Çϸ鼭 °á°ú¹°ÀÌ ÇÊ¿ä¿¡ µû¶ó ÀúÀåµÉ µð·ºÅ丮ÀÌ´Ù. ±×¸®°í ./srcµð·ºÅ丮 ¾Æ·¡¿¡´Â...

./src/org/nahome/hangulee/
ÀÌ·± µð·ºÅ丮°¡ Á¸ÀçÇÑ´Ù. ±×¸®°í hanguleeµð·ºÅ丮 ¾Æ·¡ LibExamGCJ.java, LibExamGCJ2.java¶ó´Â ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù. ±×¸®°í °¢ ÆÄÀÏÀÇ ¼Ò½º ÄÚµå´Â °£´ÜÇÑ ¿¹Á¦¿¡ ¸Â°Ô »ý¼ºÀÚ¸¸ Á¸ÀçÇÑ´Ù. ´ÙÀ½°ú °°´Ù.

package org.nahome.hangulee;
public class LibExamGCJ
{
  LibExamGCJ()
  {
    System.out.println("Two Class GCJ Test --- this is print in lib");
  }
}

package org.nahome.hangulee;
public class LibExamGCJ2
{
  LibExamGCJ2()
  {
    System.out.println("Two Class GCJ Test --- this is print in lib2");
  }
}
´ÙÀ½Àº ½ÇÁ¦ ¿ì¸®°¡ ¿¹¿¡¼­ »ç¿ëÇÒ MakefileÀÌ´Ù. MakefileÀº »óÀ§.. ±×·¯´Ï±î ./src µð·ºÅ丮°¡ ÀÖ´Â µð·ºÅ丮¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.

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Àº ÀÌ ÆÐÅ°Áö¸¦ »ç¿ëÇÒ ¼Ò½º Äڵ带 ÄÄÆÄÀÏ ÇÒ¶§ Ŭ·¡½º Æнº¿¡ ÁöÁ¤Çϱâ À§ÇØ ÇÊ¿äÇÏ´Ù.

ÀÚ!.. ÀÌÁ¦ °£´ÜÇÑ ¶óÀ̺귯¸®°¡ ÁغñµÇ¾ú´Ù.

2.3. ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ °£´ÜÇÑ ¿¹Á¦

¿¹Á¦´Â ´Ù¸¥ µð·ºÅ丮¿¡´Ù°¡ ¸¸µéµµ·Ï ÇÒ °ÍÀÌ´Ù. ±×¸®°í À̹ø¿¡´Â Makefile¾øÀÌ °£´ÜÈ÷ ÄÄÆÄÀÏ ÇÏ´Â °ÍÀ¸·Î ³¡³»µµ·Ï ÇÒ°ÍÀÌ´Ù.. ¿ì¼± ´ÙÀ½°ú °°Àº ÆÄÀÏÀ» ¸¸µç´Ù.

import org.nahome.hangulee.*;
public class ExamGCJ
{
  public static void main(String[] args)
  {
    System.out.println("Two Class GCJ Test");
    new LibExamGCJ();
    new LibExamGCJ2();
  }
}
ÀÌ·¸°Ô ÇÏ°í ´ÙÀ½Ã³·³ ºôµåÇÑ´Ù.

gcj --classpath=(À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î)/exam.jar -c ExamGCJ.java -o ExamGCJ.o
gcj --main=ExamGCJ ExamGCJ.o -L(À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î) -lexam -o ExamGCJ
ÀÌ·¸°Ô Çϸé ExamGCJ¶ó´Â Native Code°¡ ´ã±ä ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. ÀÌ°ÍÀ» ½ÇÇàÇÏ¸é °á°ú´Â...

Two Class GCJ Test
Two Class GCJ Test --- this is print in lib
Two Class GCJ Test --- this is print in lib2
ÀÌ·¸°Ô ³ª¿Ã°ÍÀÌ´Ù.... ÀÌÁ¦ ÀÌÇØ°¡ µÇ´Â°¡? ¹°·Ð À§¿¡¼­ Ŭ·¡½º Æнº¸¦ ÀÌ·¸°Ô ÁöÁ¤Çصµ µÈ´Ù.

(À§ ¿¹Á¦°¡ ÀÖ´Â µð·ºÅ丮 °æ·Î)/src
ÇÏÁö¸¸ ÀÌ·¸°Ô ÇÏ¸é ¶óÀ̺귯¸®¸¦ ¹èÆ÷ÇÒ¶§ ¾î·Á¿òÀÌ µû¸¦ °ÍÀÌ´Ù. ±×·¯´Ï jarÀ» »ý¼ºÇÏ´Â°Ô Æí¸®ÇÏ´Ù. ÀÚ!.. ÀÌÁ¦ ´õ ³ºÀº ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Â Áغñ°¡ µÇ¾ú´Â°¡? ¶Ç ´Ù¸¥ ÆÐÅ°Áö¸¦ ¶óÀ̺귯¸®·Î ¸¸µé¾îº¸°í ½ÍÁö ¾ÊÀº°¡?

3. Class.forName¸¦ »ç¿ëÇÒ¶§

JAVA·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§ JDBC µå¶óÀ̹ö¸¦ µ¿ÀûÀ¸·Î ·ÎµùÇÏ´Â °æ¿ì... ±× °æ¿ì ¿Ü¿¡´Â ±×´ÙÁö »ç¿ëµÇÁö ¾ÊÀºµí ÇÏ´Â ¸Þ¼ÒµåÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ µ¥ÀÌÅÍ º£À̽º ¾øÀÌ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ìµµ ÈçÄ¡ ¾ÊÀ¸´Ï ÀÚÁÖ »ç¿ëµÈ´Ù°í º¼ ¼ö µµ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ÀÌ·± Class.forNameÀ̶ó´Â Ŭ·¡½º°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¿¡ ´ëÇؼ­ °£´ÜÈ÷ ¾Ë¾Æº¸ÀÚ.

3.1. GCJ·Î ÇÁ·Î±×·¡¹Ö ÇÒ¶§ Class.forName¸Þ¼Òµå

ÀÌÁ¦ ÀÌ ¸Þ¼Òµå¸¦ GCJ¿¡¼­ ¾î¶»°Ô »ç¿ëÇÒ ¼ö ÀÖÀ»±î? À§¿¡¼­ º¸´Ï µ¿ÀûÀ¸·Î ·ÎµùÇϴµ¥... GCJ´Â Çϳª·Î ¸µÅ©ÇÒ¶§ ¹­¾î¼­ »ç¿ëµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë°Ô µÈ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ¼öÇàÇغ¸±â ¹Ù¶õ´Ù.

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Á¤µµ Áõ°¡ÇÑ°ÍÀ» º¼ ¼ö Àִµ¥... Ŭ·¡½º¸¦ Çؼ®ÇÒ.. ÇÊ¿äÇÑ°Ô ¹ÙÀεù µÈ °ÍÀÏ °ÍÀÌ´Ù. ±× ¾Æ·¡ ÄÄÆÄÀÏµÈ Å¬·¡½º°¡ ÀÖ´Ù¸é... ±×·±µ¥ ±× ÄÄÆÄÀÏµÈ Å¬·¡½º´Â ¹ÙÀÌÆ®ÄÚµå·Î ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù. ¾Æ¹«Æ° ÀÖ´Ù¸é ±×°ÍÀ» Àоîµé¿©¼­ »ç¿ëÇÏ°Ô µÈ´Ù.

3.2. °£´ÜÇÑ ¿¹¸¦ ÅëÇØ ¾Ë¾Æº¸±â

ÀÌÁ¦ ¿¹¸¦ ÅëÇØ Á¶±Ý ´õ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ¾Æ·¡¿Í °°ÀÌ ÇÑ°³ÀÇ ÀÎÅÍÆäÀ̽º¿Í ±×°ÍÀ» ±¸ÇöÇÑ Å¬·¡½º ±×¸®°í »ç¿ëÇÒ Å¬·¡½º¸¦ ÁغñÇÑ´Ù.

public interface forNameExamInterface
{
  void test();
}
public class forNameExam implements forNameExamInterface
{
  forNameExam()
  {
    System.out.println("forNameExample - initial");
  }
  public void test()
  {
    System.out.println("forNameExample - test");
  }
}
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Àº ´ÙÀ½°ú °°´Ù.

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¸¦ ¿ÀºêÁ§Æ® ÄÚµå·Î »ý¼ºÇؼ­.. ÇϳªÀÇ ½ÇÇàÆÄÀÏ¿¡ ¸µÅ©ÇÒ¶§ °°ÀÌ ¹­À» ¼öµµ ÀÖ´Ù.

4. 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]JavaGnomeÀ» ÀÌ¿ëÇϸé GTK/GNOMEÀ» GUI·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. GNOME 2.6ºÎÅÍ´Â GnomePlatformBindingÀ̶ó´Â ÇüÅ·Π´Ù¸¥ ¾ð¾î·Î GNOME¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϱâ À§ÇÑ ¶óÀ̺긮·¯¸¦ ¹èÆ÷Çϴµ¥, C++, Perl°ú ÇÔ²² Java°¡ ±âº»À¸·Î Æ÷ÇԵǾî ÀÖ´Ù. --iolo

4.1. SWT¸¦ ºôµåÇϱâ

SWT3.0M6À» ±âÁØÀ¸·Î ¼³¸íÇÏ°Ú´Ù. ÀÏ´Ü ¼Ò½º¸¦ ¹Þ¾Æ¼­ µð·ºÅ丮¿¡ ¸ðµÎ Ç®¸é ´ë·« ÀÌ·± µð·ºÅ丮°¡ ³ª¿Â´Ù.

org/eclipse/swt/...

¹Ù·Î ÆÐÅ°Áö°¡ ±×·¸°Ô µÇ±â ¶§¹®ÀÌ´Ù. ¾Æ¹«Æ° ÀÌ°É ¿°µÎÇØµÎ°í ºôµåÇÏ¸é µÈ´Ù. ÆÐÅ°Áö¸¦ ºôµåÇÏ´Â °ÍÀº JAVAÀÇ Package¸¦ ¶óÀ̺귯¸®·Î ¹­¾î »ç¿ëÇϱ⸦ Âü°íÇϱ⠹ٶõ´Ù. ¶ÇÇÑ JNI¿¡ ´ëÇÑ ³»¿ëµµ Âü°íÇϱ⠹ٶõ´Ù. SWT¶óÀ̺귯¸®´Â JNI¸¦ »ç¿ëÇÏ°í Àֱ⠶§¹®ÀÌ´Ù.

ÇÏÁö¸¸ ±×³É ºôµåÇÏ¸é ¸î°¡Áö ¿¡·¯¸¦ ¸¸³ª°Ô µÈ´Ù. ±×·± ¿¡·¯¸¦ ÇØ°áÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ °£´ÜÈ÷ À̾߱âÇÏ°í ³Ñ¾î°¡°Ú´Ù. ´ÙÀ½ ÆÐÅ°ÁöÀÇ Å¬·¡½º¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

org.eclipse.swt.custom.TableCursor
¿©±â¼­´Â »ó¼Ó¹ÞÀº Ŭ·¡½º¿Í ¸®ÅÏÇü¸¸ ´Ù¸£°Ô ¿À¹ö¶óÀ̵ù ÇÑ ¸Þ½îµåÀÎ traverse°¡ À־ ³ª¿À´Â ¿¡·¯ÀÌ´Ù. »ç½Ç ÀÌ°Ç JavaÀÇ ¹®¹ý¿¡µµ ¸ÂÁö ¾ÊÀ¸¸ç ¿¡·¯°¡ ¹ß»ýÇØ¾ß ¸ÂÀ¸³ª javac·Î´Â ÄÄÆÄÀÏÀÌ µÈ´Ù. ¾Æ¹«Æ° ´ÙÀ½Ã³·³ ¹Ù²Ù¸é µÈ´Ù.

void traverse... ¡æboolean traverse...
¹°·Ð À§Ã³·³ ÇØÁá´Ù¸é ¸®ÅÏ°ªµµ Á¤ÇØÁà¾ß ÇÑ´Ù´Â °ÍÀº ¸ðµÎ ¾Ë °ÍÀÌ´Ù. ±×¸®°í ´ÙÀ½ Ŭ·¡½º¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

org.eclipse.swt.custom.StyledText
À§ Ŭ·¡½º°¡ ÀÌ¹Ì Á¤ÀǵǾî ÀÖ´Ù°í ³ª¿Â´Ù. ±×·¯¸é¼­ ÀÌ¹Ì Á¤ÀÇµÈ À§Ä¡¸¦ ¾Ë·ÁÁִµ¥ StyledText¸¦ ¾Ë·ÁÁØ´Ù. ÀÌ°ÍÀº GCJÀÇ ¹ö±×ÀΰÍÀ¸·Î »ý°¢µÈ´Ù. ÇÏÁö¸¸ ´ÙÀ½Ã³·³ 1Â÷ÀûÀ¸·Î ¹ÙÀÌÆ® ÄÚµå·Î ÄÄÆÄÀÏ ÇÏ°í ÇÏ¸é µÈ´Ù.

javac -classpath .\src src/org/eclipse/swt/custom/StyledText.java
ÀÌ µÎ°¡Áö¸¸ ÇØ°áÇϸé SWT¶óÀ̺귯¸®¸¦ ºôµåÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

4.2. SWT¸¦ »ç¿ëÇÑ °£´ÜÇÑ ¿¹Á¦

ÀÌÁ¦ ºôµå¸¦ Çß´Ù¸é ¾Æ¸¶ µÎ°¡ÁöÀÇ °á°ú¹°ÀÌ ÀÖ°Ô µÉ °ÍÀÌ´Ù.

libswt.a swt.jar

±×¸®°í ´ÙÀ½ ¿¹Á¦¸¦ ÁغñÇÑ´Ù.

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

À§ µÎÆÄÀÏÀº ¼Ò½º¸¦ ¹Þ¾Æ¼­ Á÷Á¢ ºôµå¸¦ ÇÒ ¼öµµ ÀÖÀ¸¸ç ºôµåµÈ °ÍÀ» ´Ù¿î¹ÞÀ» ¼öµµ ÀÖ´Ù.

5. GCJ¿¡¼­ Java Native Interface»ç¿ëÇϱâ

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§ ÀÚ¹Ù ³»¿¡¼­ ÇØ°áÀÌ ¾î·Æ°Å³ª ºü¸¥ 󸮸¦ À§Çؼ­ JNI¶ó´Â Java Native Interface¸¦ »ç¿ëÇÑ´Ù. GCJ¿¡¼­µµ ÀÌ¿Í ºñ½ÁÇÑ ÇüÅ·ΠÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ´ÙÀ½ URL¿¡ ÀÖ´Â ¿¹Á¦¸¦ ÇÔ²² »ìÆ캸¸é¼­ GCJ¿¡¼­ ¾î¶»°Ô JNI¸¦ »ç¿ëÇÏ´ÂÁö »ìÆ캸ÀÚ. http://gcc.gnu.org/java/jni-comp.txt

5.1. JNI¸¦ À§ÇÑ ±âÃÊ

GCJ¿¡¼­´Â Sun»çÀÇ Java¿¡¼­Ã³·³ JNI¸¦ Á¦°øÇÑ´Ù. À̸¦ ÅëÇؼ­ GCJ¿¡ ÆÐÅ°Áö·Î Á¦°øµÇÁö ¾Ê´Â´Ù ÇÏ´õ¶óµµ ¹«¾ùÀ̵çÁö ÇÏ°íÀÚ ÇÏ´Â °ÍÀ» ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ JNI¿Ü¿¡µµ CNI¸¦ Á¦°øÇÑ´Ù. ¾ÆÁ÷ CNI¿¡ ´ëÇؼ­ ÇÊÀÚ´Â Á¦´ë·Î ¾Æ´Â ¹Ù´Â ¾øÁö¸¸ ¾î·ÅDzÇÑ ´À³¦¿¡ ÀÇÁ¸ÇØ À̾߱âÇÏÀÚ¸é µ¿Àû ¸µÅ© ¸ðµâÀÇ Çʿ伺 ¿©ºÎÀÌ´Ù. JNI¸¦ »ç¿ëÇÑ °æ¿ì¿¡´Â ¸®´ª½º¿Í °°Àº °æ¿ì¿¡´Â .so¶ó´Â ¸ðµâÀÌ À©µµ¿ìÁî°°Àº °æ¿ì¿¡´Â .dllÀ̶ó´Â ¸ðµâÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¹Ý¸é¿¡ CNI´Â ±×°ÍÀÌ ÇÊ¿ä ¾ø´Â µí ÇÏ´Ù. ÀÌ Á¡ÀÌ À߸øµÈ ³»¿ëÀ̶ó¸é Á¤Á¤ÇØÁֱ⠹ٶõ´Ù.

ÀÏ´Ü ÀÌ·± µÎ°¡Áö ¹æ¹ýÀ» Á¦°øÇϱ⠶§¹®¿¡ GCJ¿¡¼­´Â ±âº»ÀûÀ¸·Î CNI¸¦ »ç¿ëÇÑ´Ù´Â °¡Á¤À» ÇÏ°í ÀÚ¹Ù ¼Ò½º Äڵ带 ÄÄÆÄÀÏÇÑ´Ù. ±×·¸±â ¶§¹®¿¡ JNI¸¦ »ç¿ëÇÏ´Â °æ¿ì ±×³É ÄÄÆÄÀÏÀ» ÇÏ¸é ¿¡·¯¸¦ ¹ß»ýÇÑ´Ù. µû¶ó¼­ º°µµÀÇ ¿É¼ÇÀÌ ÇÊ¿äÇÏ´Ù. ¹Ù·Î -fjniÀÌ´Ù. ÀÌ°ÍÀº jni¸¦ »ç¿ëÇÏ´Â swt¸¦ ºôµåÇÒ¶§µµ »ç¿ëµÇ¾ú´Ù. JNI¸¦ »ç¿ëÇÏ·Á´Â ÀÚ¹Ù ¼Ò½º Äڵ尡 ÀÖ´Ù¸é ´ÙÀ½Ã³·³ ÄÄÆÄÀÏÇÑ´Ù.

gcj -fjni -o sample sample.java
¶ÇÇÑ Çì´õ ÆÄÀÏÀ» »ý¼ºÇÏ´Â °ÍÀÌ Á¦°øµÈ´Ù. Sun»çÀÇ Java¿¡¼­´Â javah¶ó´Â µµ±¸°¡ Á¦°øµÇ¾ú´Ù. GCJ¿¡¼­´Â gcjh¶ó´Â µµ±¸°¡ Á¦°øµÈ´Ù. Äֿܼ¡¼­ ´ÙÀ½Ã³·³ ¸í·ÉÀ» ³»·Á Çì´õ ÆÄÀÏÀ» »ý¼ºÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.

gcjh -jni sample
ÀÌ·¸°Ô Çϸé sample.h°¡ »ý¼ºµÈ´Ù. ±×·±µ¥ À̶§ »ý°¢Çغ¸¾Æ¾ß ÇÒ°ÍÀº gcjhÀÇ µµ¿ò¸»À» ½ÇÇàÇغ¸¸é ¾Ë ¼ö ÀÖ°ÚÁö¸¸ ÀÌ°ÍÀº .classÆÄÀϷκÎÅÍ Çì´õ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. µû¶ó¼­ ÀÌ¹Ì À§¿Í°°Àº °æ¿ì sample.class°¡ Á¸ÀçÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù.

±×¸®°í sample.h¿¡ ¸Â°Ô ±¸ÇöÀ» ÇÏ¿´´Ù¸é ±×°ÍÀ» µ¿Àû ¸µÅ© ¸ðµâ·Î ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. ¹æ¹ýÀº gcc·Î ÇÁ·Î±×·¡¹Ö ÇÒ¶§¿Í °°´Ù.

gcc -c sampNat.c
gcc -shared -o sampNat.dll sampNat.o
¿©±â¿¡ .dll·Î µÇ¾î Àִ°ÍÀº ÇÊÀÚ°¡ µ¥½ºÅ©Å¾À¸·Î ¸®´ª½º°¡ ¾Æ´Ñ À©µµ¿ìÁ ¾²°í Àֱ⠶§¹®ÀÌ´Ù. ¹°·Ð À§ÀÇ URL·Î °¡¸é ¸®´ª½º¿ë ¿¹Á¦¸¦ ¸¸³¯ ¼ö ÀÖ´Ù. ¾Æ¹«Æ° ÀÌÂëµÇ¸é ¾Æ·¡ ¿¹Á¦°¡ ¸ðµÎ ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ´Ù½ÃÇѹø ¾ð±ÞÇÏÁö¸¸ ÇÊÀÚ´Â À§ÀÇ URLÀÇ ¿¹Á¦¸¦ À©µµ¿ìÁî¿¡¼­ »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¾à°£ÀÇ ¼öÁ¤À» ÇÏ¿´´Ù.

5.2. °£´ÜÇÑ ¿¹Á¦

°£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ. À§ÀÇ URL¿¡¼­ ±×´ë·Î º¹»çÇؼ­ À©µµ¿ìÁîÀÇ Mingw¿¡¼­ »ç¿ë °¡´ÉÇϵµ·Ï ¾à°£ ¼öÁ¤À» Çß´Ù. °ÅÀÇ °°´Ù°í º¸¾Æµµ ¹«¹æÇÏ´Ù.

sample.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
#include <jni.h>
#include "sample.h"
#include <stdio.h>

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À» ÀÌ¿ëÇÏ°í ÀÖ´Ù. ÇÊÀÚ´Â ±×³É ºôµå¿¡ ÇÊ¿äÇÑ ¼ø¼­´ë·Î ³ª¿­Çغ¸µµ·Ï ÇÏ°Ú´Ù.

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À» ½ÇÇà½ÃÄѺ¸¶ó. ¸ÚÁö°Ô ½ÇÇàµÉ °ÍÀÌ´Ù.

6. ÃÖÀûÈ­·Î ¼º´É Çâ»ó½ÃÅ°±â

GCCÀÇ ÃÖÀûÈ­ ¿É¼ÇµéÀ» GCJ¿¡¼­µµ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.

# gcj -Os -s -march=pentium2 --main=Hello Hello.o
ÀÚ¼¼ÇÑ ³»¿ëÀº GccOptimizationOptionsÀ» Âü°íÇÒ °Í.

7. ½ÇÇà ÆÄÀÏ Å©±â ÁÙÀ̱â

GCJ·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇßÀ» ¶§ÀÇ °ñÄ©°Å¸® Áß Çϳª´Â, ÃÖÁ¾ ½ÇÇà ÆÄÀÏÀÇ Ä¿´Ù¶õ Å©±âÀÌ´Ù. ÇÊÀÚ´Â SWT¸¦ ÀÌ¿ëÇؼ­ Text À§Á¬¿¡ 'Hello World'¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾ú´Âµ¥, ±× Å©±â´Â Àڱ׸¶Ä¡ 48.2M³ª µÇ¾ú´Ù. ÀÌ°ÍÀº º¸ÅëÀÇ JRE ·Îµù¿¡ ÇÊ¿äÇÑ °¡ºñÁö Ä÷ºÅÍ¿Í ¼ö¹é°³ÀÇ Å¬·¡½º ÆÄÀÏÀ» ³»ÀåÇÔÀ¸·Î½á »ý±ä °á°ú·Î, ÀÛÀº ÇÁ·Î±×·¥¿¡°Ô´Â Áö³ªÄ¡°Ô ºñ´ëÇÑ ¿ë·®ÀÌ´Ù.

7.1. srtipÀ» ÀÌ¿ëÇÑ ¹æ¹ý

stripÀº ¹ÙÀ̳ʸ®¿¡¼­ ºÒÇÊ¿äÇÑ µð¹ö±ë ½Éº¼µéÀ» Á¦°ÅÇØÁØ´Ù. À©µµ¿ì À¯Àú¶ó¸é mingw/binutils°¡ ÇÊ¿äÇѵ¥, ÇÊÀÚ´Â [http]javacompiler ÆÐÅ°Áö¿¡ ³»ÀåµÈ °ÍÀ» »ç¿ëÇß´Ù.

»ç¿ë¹ýÀº ¸Å¿ì °£´ÜÇÏ´Ù.

# strip Foo.exe
À§¿¡¼­ ¾ð±ÞÇÑ ¹ÙÀ̳ʸ®ÀÇ °æ¿ì, ±× Å©±â°¡ 14.7M Á¤µµ·Î ÁÙ¾îµé¾ú´Ù.

7.2. gcjÀÇ ¿É¼ÇÀ» ÀÌ¿ëÇÑ ¹æ¹ý

gcj·Î ÄÄÆÄÀϽà -s ¿É¼ÇÀ» ÁÖ¸é ½Éº¼µéÀÌ Á¦°ÅµÇ°í ¿ë·®ÀÌ ÁÙ¾îµç´Ù.

# gcj -s --main=bar.Foo *.o Foo
ÀÌ °æ¿ì ¿ë·®Àº À§¿¡¼­ stripÀ» »ç¿ëÇßÀ» ¶§¿Í µ¿ÀÏÇÏ´Ù. ´Ü, óÀ½ ¿ÀºêÁ§Æ® Äڵ带 »ý¼º½Ã¿¡´Â -s ¿É¼ÇÀÌ ºÒÇÊ¿äÇÏ´Ù. Àû¿ëµÇÁöµµ ¾ÊÀ» »Ó´õ·¯, stripÀ» ½á¼­ °­Á¦·Î ¿ë·®À» ÁÙÀ̸é ÈÄ¿¡ gcj¿¡¼­ »ç¿ë½Ã ÆÐÅ°Áö¸¦ ãÀ» ¼ö ¾ø´Ù´Â ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

# gcj -s Bar.java //-s È¿°ú¾øÀ½
# gcj -s --main=Foo *.o Foo
# strip Bar.o
# gcj -s --main=Foo *.o Foo //Bar.o ¾ÈÀÇ ÆÐÅ°Áö¸¦ ãÀ» ¼ö ¾ø´Ù´Â ¿¡·¯

7.3. ¶óÀ̺귯¸® »ç¿ëÇϱâ

¿ÀºêÁ§Æ® ÄÚµå(*.o) ´ë½Å ¶óÀ̺귯¸®(*.a)¸¦ »ç¿ëÇÏ¸é »ç¿ëµÇÁö ¾Ê´Â Ŭ·¡½º´Â Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ¾ð±ÞÇÑ HelloWorld ÄÄÆÄÀϽà ¿ë·® Â÷ÀÌ´Â 1MB ¹Ì¸¸À¸·Î ¸Å¿ì ¹Ì¹ÌÇßÁö¸¸, ±Ô¸ð°¡ Ä¿Áú ¼ö·Ï µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

Ŭ·¡½º·Î´õ µî ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇÏ´Â °æ¿ì´Â gcj°¡ ¸ðµç Ŭ·¡½ºÀÇ »ç¿ëÀ» °¨ÁöÇÏÁö ¸øÇØ ½ÇÇàÁß ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ÁÖÀDZí°Ô »ç¿ëÇϵµ·Ï ÇÑ´Ù.

7.4. libgcj.dll ¸¸µé±â

gcj¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¥À» ¿©·µ ¸¸µå´Â °æ¿ì, libgcj¸¦ º°µµ·Î ¸ðµâÈ­ÇÏ¿© ¿ë·®À» Å©°Ô ÁÙÀÏ ¼ö ÀÖ´Ù. ´ÙÀ½ ¹®¼­µéÀ» Âü°íÇ϶ó.

°¡´ÉÇÏ´Ù¸é java.awt.*, javax.swing.* µîÀÇ ÆÐÅ°Áö¸¦ Á¦°ÅÇÏ´Â °Íµµ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

7.5. UPX¸¦ ÀÌ¿ëÇÑ ¹æ¹ý

[http]UPX¸¦ »ç¿ëÇÏ´Â °Íµµ ÇϳªÀÇ ¹æ¹ýÀÌ´Ù. ¾ÐÃà ¼Óµµ°¡ ¸Å¿ì ºü¸£¸ç ½ÇÇà ¼Óµµ¿¡µµ °ÅÀÇ ¿µÇâÀ» ¹ÌÄ¡Áö ¾ÊÁö¸¸, ´ë½Å ¸Þ¸ð¸® Á¡À¯À²ÀÌ ¾ÐÃàÀü ÆÄÀÏÀÇ ¿ë·®¸¸Å­ ´Ã¾î³­´Ù.

»ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.
# 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

°¡Àå ºü¸¥ ¾ÐÃà¿¡¼­Á¶Â÷ ½ÇÇà ÆÄÀÏÀÇ Å©±â°¡ Àý¹Ý ÀÌÇÏ·Î ÁÙ¾îµç °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

8. GCJ Bug & Patch

  • [http]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


from wiki.kldp.org by me

ID
Password
Join
Enjoy your life; be pleasant and gay, like the birds in May.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-09-17 17:44:47
Processing time 0.0222 sec