@related: [[Java]] [[gcc]] [[Compiler]] [[TuxGuitar]] [[jdk]] ==== [[Libre]] [[Java]] [[Compiler]] : gcj ==== * http://gcc.gnu.org/java * irc://irc.oftc.net/#gcj * irc://irc.freenode.net/#classpath. [[ToDo]] : http://lists.debian.org/debian-gcc/2005/04/msg00020.html mkdir -p gcjtest ; cd gcjtest cat > Test.java << EOF class Test { public static int f(int in) { System.out.println("#{ Test.java::f"); System.out.println("#" + in ); System.out.println("#} Test.java::f"); return in; } // public static void fvoid() { } // jni bug to check? } EOF cat > Main.java < On [[Linux]] : # $ make gcj -C --classpath=. Test.java gcj -c -o Test.o --classpath=. Test.java libtool --mode=link --tag=GCJ gcj --shared Test.o -o libgcjtest.so gcj -c -o Main.o --classpath=. Main.java gcj -o main --main=Main --classpath=. Main.o -lgcjtest -L. -lgcj ldd main # libgcjtest.so => ./libgcjtest.so (0xb7fe7000) # libgcj.so.3 => /usr/lib/./libgcj.so.3 (0xb79f4000) # libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb79d8000) # libm.so.6 => /lib/tls/libm.so.6 (0xb79b6000) # libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb79a7000) # libz.so.1 => /usr/lib/./libz.so.1 (0xb7995000) # libdl.so.2 => /lib/tls/libdl.so.2 (0xb7992000) # libc.so.6 => /lib/tls/libc.so.6 (0xb785d000) # /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000) LD_LIBRARY_PATH=. && ./main * #{ Main.java::main #{ Test.java::f #7 #} Test.java::f #} Main.java::main ==== On [[Cygwin]] : ==== gcj -C --classpath=. Test.java gcj -c -o Test.o --classpath=. Test.java gcj -Wl,-Bsymbolic -shared -fPIC -fjni -findirect-dispatch Test.o -o libgcjtest.so # ok [[Cygwin]] gcj -c -o Main.o --classpath=. Main.java gcj -o main --main=Main --classpath=. Main.o -lgcjtest -L. -lgcj # h:\usr\local\WIN32\opt\thisiscool-gcc\gcc-3.4\bin\..\lib\gcc\i686-pc-mingw32\3.4.0\..\..\..\..\i686-pc-mingw32\bin\ld.exe: # cannot find -lgcjtest http://www.thisiscool.com/gcc_mingw.htm gcj works pretty fine, unless when I tried to make a shared library (.so) under [[Cygwin]], this code works flawlessly w/ gcc 3.4 [[Linux]] [[Debian]] you wrote a warning on gcc 4.0 but this also happend on 3.4 (see code) ==== [[C++]] ==== http://gcc.gnu.org/onlinedocs/gcj/Invocation.html#Invocation cat > main-cpp.cpp << EOF #include #include #include #include int main(int argc, char *argv) { using namespace java::lang; try { JvCreateJavaVM(NULL); JvAttachCurrentThread(NULL, NULL); String *message = JvNewStringLatin1("Hello from C++"); JvInitClass(&System::class$); System::out->println(message); JvDetachCurrentThread(); } catch (Throwable *t) { System::err->println(JvNewStringLatin1("Unhandled Java exception:")); t->printStackTrace(); } } EOF make CXX=gcj LDFLAGS=-lgcj main-cpp && ./main-cpp ==== [[C++]] call a dynamic native [[Java]] library ==== cat > main-test-cpp.cpp << EOF #include #include #include #include #include "Test.h" int main(int argc, char *argv) { using namespace java::lang; try { JvCreateJavaVM(NULL); JvAttachCurrentThread(NULL, NULL); String *message = JvNewStringLatin1("Hello from C++"); JvInitClass(&System::class$); System::out->println(message); ::Test::f( argc ); JvDetachCurrentThread(); } catch (Throwable *t) { System::err->println(JvNewStringLatin1("Unhandled Java exception:")); t->printStackTrace(); } } EOF make CXX=gcj LDFLAGS="-lgcj -lgcjtest -L." main-test-cpp && ./main-test-cpp * Hello from C++ #{ Test.java::f #10 #} Test.java::f ldd main-test-cpp libgcj.so.3 => /usr/lib/libgcj.so.3 (0xb79e4000) libgcjtest.so => ./libgcjtest.so (0xb79e1000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb79d8000) libm.so.6 => /lib/tls/libm.so.6 (0xb79b6000) libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb79a7000) libz.so.1 => /usr/lib/libz.so.1 (0xb7995000) libdl.so.2 => /lib/tls/libdl.so.2 (0xb7992000) libc.so.6 => /lib/tls/libc.so.6 (0xb785d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000) ==== GCJH ==== cat Test.java class Test { static final String FILE = new String("Test.java"); public static void test() { System.out.println( FILE + ":0: log: #{ " + "Test::test"); System.out.println( FILE + ":0: log: #} " + "Test::test"); } public static void main(String[] args) { System.out.println( FILE + ":0: log: #{ " + "Test::main"); test(); System.out.println( FILE + ":0: log: #} " + "Test::main"); } } gcj -c -o Test.class.o --classpath=. Test.java libtool --mode=link --tag=GCJ gcj --shared -o libTest.jar.so Test.class.o libtool: link: gcj --shared -o libTest.jar.so Test.class.o javac Test.java gcjh Test.class -o Test.java.h cat Test.java.h // DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- #ifndef __Test__ #define __Test__ #pragma interface #include #include extern "Java" { class Test; } class Test : public ::java::lang::Object { public: // actually package-private Test(); public: static void test(); static void main(JArray< ::java::lang::String * > *); public: // actually package-private static ::java::lang::String * FILE; public: static ::java::lang::Class class$; }; #endif // __Test__ cat main.cpp #include #include #include #include #include "Test.java.h" int main(int argc, char *argv[]) { using namespace java::lang; try { JvCreateJavaVM(NULL); JvAttachCurrentThread(NULL, NULL); String *message = JvNewStringLatin1( __FILE__ ":" "0" ": log:" ); JvInitClass(&System::class$); System::out->println(message); ::Test::test(); //::Test::main(); JvDetachCurrentThread(); } catch (Throwable *t) { System::err->println(JvNewStringLatin1("Unhandled Java exception:")); t->printStackTrace(); } } gcj -L. -lgcj -lTest.jar -o main.exe main.cpp cc1plus: warning: command line option "-fbootclasspath=./:/usr/share/java/libgcj-4.4.jar" is valid for Java but not for C++ LD_LIBRARY_PATH=. ./main.exe main.cpp:0: log: Test.java:0: log: #{ Test::test Test.java:0: log: #} Test::test