· 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
Promptness is its own reward, if one lives by the clock instead of the sword.


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.0323 sec