This is a trivial example of a JNI native method intended to provide a comparison with the GCJ CNI example. This was built using the Kaffe JVM on a Red Hat 6.0 system; substitute 'javah' for 'kaffeh' for Sun's JDK. ==> Makefile <== libsampNat.so: sampNat.o gcc -shared -o libsampNat.so sampNat.o sampNat.o: sampNat.c sample.h gcc -I/usr/include/kaffe -c sampNat.c sample.h: sample.class kaffeh -jni sample sample.class: sample.java javac sample.java clean: rm -f sample.h sample.class sampNat.o libsampNat.so ==> sampNat.c <== #include #include "sample.h" #include JNIEXPORT void JNICALL Java_sample_myNative(JNIEnv* env, jobject this, jstring s) { jclass cls; jfieldID fid; jobject obj; jmethodID mid; printf("From C\n"); cls = (*env)->FindClass(env, "java/lang/System"); if (cls == 0) { printf("java/lang/System lookup failed\n"); return; } fid = (*env)->GetStaticFieldID(env, cls, "out", "Ljava/io/PrintStream;"); if (fid == 0) { printf("java/lang/System::out lookup failed\n"); return; } obj = (*env)->GetStaticObjectField(env, cls, fid); if (obj == 0) { printf("GetStaticObjectField call failed\n"); return; } cls = (*env)->GetObjectClass(env, obj); if (cls == 0) { printf("GetObjectClass(out) failed\n"); return; } mid = (*env)->GetMethodID(env, cls, "println", "(Ljava/lang/String;)V"); if (mid == 0) { printf("println method lookup failed\n"); return; } (*env)->CallVoidMethod(env, obj, mid, 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"); } static { System.loadLibrary("sampNat"); } }