@related: Java gcc Compiler TuxGuitar jdk
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 <<EOF
class Main {
public static void main(String[[]] args) {
System.out.println("#{ Main.java::main");
Test.f ( args.length );
System.out.println("#} Main.java::main");
}
}
EOF
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
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)
http://gcc.gnu.org/onlinedocs/gcj/Invocation.html#Invocation
cat > main-cpp.cpp << EOF
#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.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);
JvDetachCurrentThread();
} catch (Throwable *t) {
System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
t->printStackTrace();
}
}
EOF
make CXX=gcj LDFLAGS=-lgcj main-cpp && ./main-cpp
cat > main-test-cpp.cpp << EOF
#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>
#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)
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 <java/lang/Object.h>
#include <gcj/array.h>
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 <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>
#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