Thursday, October 13, 2005

In the end...

Dopo alcuni giorni di prove finalmente ieri sono riuscito a risolvere il problema del linking a swt. Devo ringraziare Tom Tromey di Red Hat e sviluppatore di gcj per avermi assistito.

Gli "undefined reference" erano causati dal fatto che non compilavo il .jar, ma lo includevo solo nel classpath. In particolare il primo "undefined reference" riferito a Test::Class era causato dal fatto che l'opzione --main di gcj deve contenere l'intero percorso della classe(test.swt.Test).

Il passo successivo è stato quindi di procedere alla compilazione come segue:

nivox@host:~/Test/$gcj --main=test.swt.Test --classpath $SWT_HOME/swt.jar test/swt/Test.java $SWT_HOME/swt.jar -lswt-gtk-3138
org/eclipse/swt/graphics/ImageLoader.java: In class 'org.eclipse.swt.graphics.ImageLoader':
org/eclipse/swt/graphics/ImageLoader.java: In method 'org.eclipse.swt.graphics.ImageLoader.load(java.lang.String)':
org/eclipse/swt/graphics/ImageLoader.java:149: error: verification error at PC=40
org/eclipse/swt/graphics/ImageLoader.java:149: error: label part of different subroutines

Questo altro problema è invece meno banale del primo: è causato dal fatto che alcune applicazioni utilizzano del codice loro per leggere stream di bytecode e caricarli come classi utilizzando ClassLoader.defineClass().
Una spiegazione dettagliata del problema è della sua soluzione si trova sul wiki di gcc: How to BC compile with GCJ.

Per farla breve è necessario utilizzare i flag -findirect-dispath e -fjni (poichè le swt utilizzano la Java Native Interface per accedere a librerie native):

nivox@host:~/Test/$gcj -fjni -findirect-dispatch --main=test.swt.Test --classpath $SWT_HOME/swt.jar test/swt/Test.java $SWT_HOME/swt.jar -lswt-gtk-3138
nivox@host:~/Test/$ls
test a.out

Insomma in conclusione la compilazione di un applicazione basata sulle SWT tramite gcj non è stata così semplice come predicato dai vari articoli che si trovano su internet.

No comments: