(a)
public class CSimpleJNI {
    private int nValue;
    public int getValue() {
    return nValue;
    }
    public void putValue(int newValue) {
    nValue = newValue;
    }
    public int transformValue(int someValue) {
    putValue(getValue() + someValue);
    return getValue();
    }
    public native void nativeMethod(int param);
}


(b)
gcj -C CSimpleJNI.java


(c)
gcjh -jni CSimpleJNI


(d)
#include "CSimpleJNI.h"
void Java_CSimpleJNI_nativeMethod(JNIEnv *env, jobject thisObj, jint param1)
{
  jclass clsID;
  jmethodID mthdID;
  jmethodID putValueID;
  jint jiValue;
  (*env)->GetObjectClass(env, thisObj);
  mthdID = (*env)->GetMethodID(env, clsID, "getValue", "()I");
  jiValue = (*env)->CallIntMethod(env, thisObj, mthdID);
  /* in real life, this would complex code */
  jiValue++;
  mthdID = (*env)->GetMethodID(env, clsID, "putValue", "(I)V");
  (*env)->CallVoidMethod(env, thisObj, mthdID, jiValue);
}

Example 1: (a) Java class code stored in CSimpleJNI.java; (b) source Java code compiled into object code (bytecode); (c) extracting native method prototypes; (d) the C code.

Back to Article