Listing 2: Sample native code that uses the original JNI (excerpt from jni_example_org.cpp)

JNIEXPORT void JNICALL 
Java_JniExample_org_1native_1call 
   (JNIEnv *env, jclass clazz, jobject obj) {

   // Lookup the integer field ('intField') in 'obj' 
   // and get its value
   jfieldID intFieldId = env->GetFieldID(clazz, "intField", "I");
   if (id == 0) throw JNIException("Field not found");
   int intFieldVal = env->GetIntField(obj, intFieldId);

   // Lookup the static String field ('stringField') in 'obj',
   // then convert the Java string representation
   // to C++ type 'const char *'.
   jfieldID strFieldId = 
      env->GetStaticFieldID(clazz, "stringField", 
         "Ljava/lang/String;");
   if (id == 0) throw JNIException("Field not found");
   jstring jstr = 
      (jstring) env->GetStaticObjectField(clazz, strFieldId);
   const char *str = 
      (jstr == 0) ? 0 : env->GetStringUTFChars(jstr, 0);

   // Lookup the integer array field ('intArray') in 'obj', 
   // then convert it to C++ type 'jint *'.
   jfieldID arrFieldId = 
      env->GetFieldID(clazz, "intArray", "[I");
   if (id == 0) throw JNIException("Field not found");
   jintArray jarr = 
      (jintArray) env->GetObjectField(obj, arrFieldId);
   jint *arr = env->GetIntArrayElements(jarr, 0);

   // Set new values
   env->SetIntField(obj, intFieldId, 0);
   arr[0] = 0; arr[1] = 0;
   env->SetStaticObjectField(clazz, strFieldId, 
      env->NewStringUTF("Good-bye, world!"));

   // Explicitly release resources
   env->ReleaseIntArrayElements(jarr, arr, 0);
   env->ReleaseStringUTFChars(jstr, str);
}
— End of Listing —