Here is a sample project demonstrating the basics of building a CNI application with GCJ version 2.95. It assumes that you have installed the binaries to /usr/local/bin. Version 2.95 does not install the include files necessary to compile CNI programs, so you'll need to reference the source and build directories to get the relevant files. This drawback is corrected in version 2.96. The source directory is /home/gcc/source/libgcj-2.95.1. The build directory is /home/gcc/build/libgcj ==> Makefile <== sample: sample.o sampNat.o /usr/local/bin/gcj -o sample sample.o sampNat.o -lstdc++ --main=sample sample.o: sample.class /usr/local/bin/gcj -c sample.class sample.class: sample.java /usr/local/bin/gcj -C sample.java sample.h: sample.class /usr/local/bin/gcjh sample sampNat.o: sample.h sampNat.cc /usr/local/bin/gcc \ -I/home/gcc/source/libgcj-2.95.1/libjava/include \ -I/home/gcc/source/libgcj-2.95.1/libjava \ -I/home/gcc/build/libgcj/i486-pc-linux-gnu/libjava/include \ -I/home/gcc/build/libgcj/i486-pc-linux-gnu/libjava \ -fno-rtti \ -c sampNat.cc clean: rm -f sample sample.o sampNat.o sample.class sample.h ==> sampNat.cc <== #include "sample.h" #include #include #include #include #include void sample::myNative(java::lang::String *s) { cout << "Hello, C++" << endl; // The following line causes a link error for a missing typeinfo // unless this file is compiled with '-fno-rtti' java::lang::System::out->println(s); } ==> 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"); } }