ImperialViolet

Java CNI (04 Dec 2002)

A quick lesson in the wonders of how Java and GCC work together.

For quite a while now, the GCJ project has been adding Java support to GCC. It isn't perfect and building your big, using every API Java app with it could be a real pain. But it is getting better. Anyway, this is about working together.

Java has always had JNI for interfacing with other languages (generally C/C++). It works, but it's not exactly clean. GCJ, however, has the CNI which works much more nicely. A small example:

Make up a Java class and have some methods marked as public:

class CNITest {
	public static native int native_call (String a);

	public static void main (String[] args) {
		native_call ("testing");
	}
}

Build a class file and generate the header from it

gcj -C CNITest.java
gcjh CNITest

Write the native methods in whatever language you like (given that GCC and compile and link it with Java). In this case C++:

#include "CNITest.h

jint CNITest::native_call (jint a)
{
        return a + 1;
}

Now build it all:

gcj --main=CNITest -o cni CNITest.java cni.cpp

and it all works. Woo!