[우분투+Eclipse+GCJ+JavaGNOME] HelloWorldGNOME 만들기

atie의 이미지

Ubuntu 리눅스를 사용을 하고, Eclipse를 설치한 것으로 하고, 시작을 한다. (그렇다고 꼭 우분투를 설치하라는 것은 아니다. :) )

- gcj 그리고 java gnome 설치 :
sudo apt-get install gcj libgtk-java libgnome-java libglade-java libgconf-java

- Eclipse에서 gcj jre 설치 :
Preferences --> Java --> Installed JREs 에 gcj-jre (Name), /usr/lib/jvm/java-gcj/jre (Location) 추가

- Eclipse에서 새 프로젝트 생성후, gcj jre를 시스템 라이브러리로 설정 :
Project Properties --> Libraries --> 설정되어 있는 JRE System Library를 Remove
Project Properties --> Libraries --> Add Library --> JRE System Library --> Alternate JRE 에 gcj-jre 설정

- Java Gnome JARs를 프로젝트에 등록 :
Project Properties --> Libraries --> Add External JARs 하여,
/usr/share/java/glade2.x.jar
/usr/share/java/gnome2.x.jar
/usr/share/java/gtk2.x.jar
/usr/share/java/gconf2.x.jar 추가
* ex) gnome2.10.jar -> gnome2.10-2.10.1.jar로 링크되는 구조이니, gnome2.10.jar를 등록.

- 예제 소스 생성 - HelloWorldGNOME.java

import org.gnu.gnome.App;
import org.gnu.gnome.Program;
import org.gnu.gtk.Button;
import org.gnu.gtk.Gtk;
import org.gnu.gtk.event.ButtonEvent;
import org.gnu.gtk.event.ButtonListener;
import org.gnu.gtk.event.LifeCycleEvent;
import org.gnu.gtk.event.LifeCycleListener;

public class HelloWorldGNOME {

	public HelloWorldGNOME() {

		App app = new App("Hello", "Hello World!");
		Button btn = new Button("Click me!");
		
		btn.addListener(new ButtonListener() {
			public void buttonEvent(ButtonEvent e) {
				if (e.isOfType(ButtonEvent.Type.CLICK)) {
					System.out.println("Hello, " + System.getProperty("java.fullversion"));
				}
			}
		});

		app.addListener(new LifeCycleListener() {
			public void lifeCycleEvent(LifeCycleEvent arg0) {
			}
			public boolean lifeCycleQuery(LifeCycleEvent arg0) {
				// quit the app...
				System.out.println("Quit...Bye!");
				Gtk.mainQuit();
				return false;
			}
		});

		app.getVBox().add(btn);

		app.setDefaultSize(150, 50);
		app.showAll();
	}

	public static void main(String[] args) {
		Program.initGnomeUI("Hello", "0.1", args);
		new HelloWorldGNOME();
		Gtk.main();
	}
}

- 작성된 HelloWorldGNOME을 실행
gtkjni 에러가 나는 경우, Run.. --> Arguments --> VM Arguments 에 -Djava.library.path=/usr/lib 를 추가.

- glade를 사용하는 것은 여기의 동영상을 참조해 보시고, 가자~ 자바+그놈의 세계로...

File attachments: 
첨부파일 크기
Image icon eclipse-ant-gcj-native-gtk.png132.14 KB
Image icon Dapper-kdebindings-java.png254.87 KB
Forums: 
atie의 이미지

위의 글을 읽어보시고, gcj로 컴파일을 하면 native 실행 파일을 만들 수 있을텐데 하고 궁금하신 분들을 위한 gcj+ant 콤보입니다.

우선, 위의 소스를 다음처럼 약간 수정을 해서 제 경우는 javaGnome 프로젝트 / org.atie.java.gnome 패키지 밑에 HelloWorldGNOME.java로 저장을 하였습니다.

package org.atie.java.gnome;

import org.gnu.gnome.App;
import org.gnu.gnome.Program;
import org.gnu.gtk.Button;
import org.gnu.gtk.Gtk;
import org.gnu.gtk.Label;
import org.gnu.gtk.event.ButtonEvent;
import org.gnu.gtk.event.ButtonListener;
import org.gnu.gtk.event.LifeCycleEvent;
import org.gnu.gtk.event.LifeCycleListener;


public class HelloWorldGNOME {

	public HelloWorldGNOME() {

		App app = new App("Hello", "Hello World!");
		Button btn1 = new Button("Click me!");
		Button btn2 = new Button("Clear me!");
		final Label lbl = new Label("");
		
		btn1.addListener(new ButtonListener() {
			public void buttonEvent(ButtonEvent e) {
				if (e.isOfType(ButtonEvent.Type.CLICK)) {
					lbl.setText("Hello, " + System.getProperty("java.fullversion"));
				}
			}
		});
		
		btn2.addListener(new ButtonListener() {
			public void buttonEvent(ButtonEvent e) {
				if (e.isOfType(ButtonEvent.Type.CLICK)) {
					lbl.setText("");
				}
			}
		});

		app.addListener(new LifeCycleListener() {
			public void lifeCycleEvent(LifeCycleEvent arg0) {
			}
			public boolean lifeCycleQuery(LifeCycleEvent arg0) {
				// quit the app...
				//System.out.println("Quit...Bye!");
				Gtk.mainQuit();
				return false;
			}
		});

		app.getVBox().add(btn1);
		app.getVBox().add(lbl);
		app.getVBox().add(btn2);

		app.setDefaultSize(250, 100);
		app.showAll();
	}

	public static void main(String[] args) {
		Program.initGnomeUI("Hello", "0.1", args);
		new HelloWorldGNOME();
		Gtk.main();
	}
}

그리고, ant를 위해 build.xml을 다음처럼 만들어 javaGnome 프로젝트 밑에 넣습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="javaGnome" default="compile">
    <path id="javaGnome.classpath">
        <pathelement location="/usr/share/java/gtk2.6.jar" />
        <pathelement location="/usr/share/java/gnome2.10.jar" />
    </path>
    <target name="compile"> 
        <javac debug="on" classpathref="javaGnome.classpath" includeJavaRuntime="no" compiler="gcj" destdir="bin">
            <src path="src" />
            <include name="**/*.java" />
        </javac>
    </target>
    <target name="nativebuild"> 
        <javac debug="on" classpathref="javaGnome.classpath" includeJavaRuntime="no" compiler="gcj">
            <src path="src" />
            <include name="**/*.java" />
            <compilerarg line="--main=org.atie.java.gnome.HelloWorldGNOME -lgnomejava-2.10 -lgtkjava-2.6 -o helloworld" />
        </javac>
    </target>
</project>

ant target "compile"은 bin 디텍토리에 클래스 파일을 만들 때 사용을 하고, "nativebuild" target은 javaGnome 프로젝트 밑에 helloworld라는 native 실행 파일을 만드는데 사용이 됩니다. gnome java 버전이 틀린 것은 각자의 경우에 맞춰 수정을 해주시고, nativebuild를 ant viewer에서 실행합니다.
그런 후, javaGnome$ ./helloworld 8) :lol:
댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트

----
I paint objects as I think them, not as I see them.
atie's minipage

이한길의 이미지

코코아만큼이나 멋져 보이긴 합니다만...

플렛폼에 독립적인 어플리케이션을 작성하기엔...
좀 어려운 면이 있겠군요.. 좀 아쉽네요..

아무튼 저런것도 있단걸 알려주셔서 감사합니다 ^^*

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

iolo의 이미지

저도 개인적으로 java-gnome에 관심을 갖고 있고, 작은 패치도 몇개 하고 했습니다만... 현재 가장 큰 걸림돌은 패키징입니다.

위에 이한길님이 플랫폼 독립에 대해서 염려하셨는데
현재로썬 윈도와 리눅스에선 문제가 없습니다.
그리고 OSX에선 x11의 GTK를 통해서 돌리면 문제가 없습니다.(현재로썬 GTK가 aqua네이티브 포트가 없기 때문이지요)

다만, 그렇게 만든 어플리케이션을 어떻게 배포할것인가에 대해서는 상당히 난감합니다. gnome language bindings으로는 꾸준히 타르볼로 패키징되는데
특성상 빌드가 겁나게 오래걸리는 관계로... 쉽지가 않죠.
그렇다고 패키지를 쓰자니... 버전이 너무 늦게 따라오고 새로 추가된 바인딩들이 추가되질 않습니다(이미 gtkhtml, gtkmozembed, gconf나 gnomevfs, cairo 등의 바인딩까지 다 만들어져있지만 패키지는 올라올 기미가 안보이는군요). 그렇다보니 만든 프로그램 배포도 난감한 부분이 있습니다. autotools와의 궁합도 좀 고민거리죠.(자바 개발자들은 ant쪽을 선호하다보니 상대적으로 무관심해서...)

이러한 문제들이 해결된다면 재미있는 솔루션이 될수도 있겠다고 생각합니다만...

----
the smile has left your eyes...

atie의 이미지

여담으로 어제 우분투 포럼에는 java-gnome 패키지가 뒤떨어졌으니 패키징을 새로 해 줄 것을 요청하는 글이 올라왔더군요. 필요한 사람이 배포판 제작팀에게 압력을 넣은 것이 최선의 방법일 듯 합니다.

이 하우투를 쓴 저의 개인적인 선호는 swt입니다. 그렇지만, 위의 방법에도 흥미가 있고, 시간이 허락이 되면 위의 방법과 swt을 썼을 때의 비교를 코딩의 차이점부터 실행화일의 크기 등등해서 우선은 리눅스에서 다음엔 윈도우즈에서 하는 식으로 해보고는 싶습니다. (그 사이에 관심있는 다른 분들이 해주길 기대하면서요. :wink: )

----
I paint objects as I think them, not as I see them.
atie's minipage

익명 사용자의 이미지

Subject: ASIANUX 국내 프로젝트 도입사례 (한소프트리눅스)

벌써, ASIANUX (아시아눅스) 1.0 및 2.0의 리눅스의 국내 프로젝트 도입사례가 있네요.

http://www.haansoftlinux.com/business/case_list.php

아시아눅스, 상업적으로 성공할 수 있기를 바랍니다.

그런데, 아시아눅스는 '리눅스'(Linux)라는 명칭을 사용하지 않으니,
'리누스 토발즈'에게 돈(상표값) 안줘도 되겠네요! 펄헐!

이한길의 이미지

iolo wrote:
위에 이한길님이 플랫폼 독립에 대해서 염려하셨는데
현재로썬 윈도와 리눅스에선 문제가 없습니다.
그리고 OSX에선 x11의 GTK를 통해서 돌리면 문제가 없습니다.(현재로썬 GTK가 aqua네이티브 포트가 없기 때문이지요)

친절한 설명에 감사드립니다... 제가 아는것이 워낙 없다보니...

근데... 지금 .. 제 글 바로 위에 글쓴 분.. 웬 아시아눅스 이야긴지..
잘 모르겠지만 혹시 아시아눅스에 이게 쓰였단 이갸기인가요?

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

atie의 이미지

어제 제가 우분투의 대퍼 패키지중에 업데이트가 뜨기를 기다렸던 것이 kdebindings-java 였는데 방금 전에 업데이트를 해서 예제로 포함된 심플브라우저를 eclipse에서 실행시켜 본 화면입니다. 창제목은 KDE2라고 뜨지만 실행 환경은 kde3.5 + java 1.5 입니다. (아직 위에처럼 gcj로 컴파일은 하지 않은 상태이고요.)
이제는 gnome과 kde도 자바로 즐겨봅시다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트

----
I paint objects as I think them, not as I see them.
atie's minipage

atie의 이미지

혹시 위의 KDE 예제를 gcj로 네이티브 빌드해 보신 분 계신가요? 아래처럼 build.xml을 만들어 컴파일과 빌드 둘다 되는데 ksimplebrowser를 실행을 시켜보면 달랑 Segmentation fault만 봅니다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="javaKDE" default="compile">
    <path id="javaKDE.classpath">
        <pathelement location="/usr/share/java/koala.jar" />
        <pathelement location="/usr/share/java/qtjava.jar" />
    </path>
    <target name="compile">
        <javac debug="on" classpathref="javaKDE.classpath" includeJavaRuntime="no" compiler="gcj" destdir="bin">
            <src path="src" />
            <include name="**/*.java" />
        </javac>
    </target>
    <target name="nativebuild">
        <javac debug="on" classpathref="javaKDE.classpath" includeJavaRuntime="no" compiler="gcj">
            <src path="src" />
            <include name="**/*.java" />
            <compilerarg line="--main=org.atie.java.kde.Main -fjni -shared -o ksimplebrowser" />
        </javac>
    </target>
</project> 

----
I paint objects as I think them, not as I see them.
atie's minipage

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.