| The C++ code for the JNI example are shown below.    
              
                 
                  | NativeJNIDemo.cpp |   
                  | #include 
                      "javatech_jni22_JNIDemo.h"
 JNIEXPORT void JNICALL
 Java_javatech_jni22_JNIDemo_doStatic (JNIEnv 
                      *jenv, jclass cls)
 {} // doStatic
 
 JNIEXPORT void JNICALL
 Java_javatech_jni22_JNIDemo_doSomething (JNIEnv 
                      *jenv, jobject jo)
 {
 // Find the jclass corresponding to the jobject
 jclass cls = jenv->GetObjectClass (jo);
 
 // Get the static a_static_float field.
 jfieldID fid = jenv->GetStaticFieldID (cls, 
                      "a_static_float", "F");
 jfloat a_static_float = jenv->GetStaticFloatField 
                      (cls, fid);
 printf ("got a_static_float = %f\n", a_static_float);
 
 // Find the field ID of the 'my_custom' field
 jfieldID my_custom_fid = jenv->GetFieldID (
 cls, "my_custom", "Ljavatech/jni22/MyCustomObject;"
 );
 if (my_custom_fid == NULL)
 return;
 printf ("got my_custom_fid\n");
 
 // Get the jobject reference to 'my_custom'
 jobject my_custom_jo = jenv->GetObjectField 
                      (jo, my_custom_fid);
 printf ("got my_custom_jo\n");
 
 // Find the jclass of the my_custom_jo jobject.
 jclass my_custom_cls = jenv->GetObjectClass 
                      (my_custom_jo);
 printf ("got my_custom_cls\n");
 
 // Find the field ID of the 'val' field of MyCustomObject.
 jfieldID val_fid = jenv->GetFieldID (my_custom_cls, 
                      "val", "I");
 if (val_fid == NULL) {
 jthrowable jth = jenv->ExceptionOccurred 
                      ();
 if (jth) {
 printf ("  there 
                      was an exception\n");
 jenv->ExceptionDescribe 
                      ();
 jenv->ExceptionClear 
                      ();
 printf ("  described 
                      and cleared it\n");
 }
 return;
 }
 printf ("got val_fid\n");
 
 // Get the 'val' field
 jint val = jenv->GetIntField (my_custom_jo, 
                      val_fid);
 printf ("got val = %d\n", val);
 
 // Manipulate it somehow
 jint multiplier = (jint) a_static_float;
 val *= multiplier;
 printf ("multiplied it by %f\n", a_static_float);
 
 // Set it back into my_custom_jo
 jenv->SetIntField (my_custom_jo, val_fid, val);
 printf ("put it back into my_custom_jo\n");
 
 // Get the method ID to call a Java method
 jmethodID mid = jenv->GetMethodID (cls, "callback", 
                      "(I)I");
 if (mid == NULL)
 return;
 printf ("got mid\n");
 
 jint param = 8;
 // Call the Java method
 printf ("calling Java 'callback' method\n");
 jint ret = jenv->CallIntMethod (jo, mid, param);
 // Check for any exception that may have occurred 
                      during the Java method
 jthrowable jth = jenv->ExceptionOccurred ();
 if (jth) {
 printf ("  there was an 
                      exception\n");
 jenv->ExceptionDescribe ();
 jenv->ExceptionClear ();
 printf ("  did not return 
                      from Java 'callback'\n");
 }
 else
 printf ("  return from 
                      'callback' = %d\n", ret);
 } // doSomething
 |   
                  | NativeHelloWorld.cpp |   
                  | #include "javatech_jni22_JNIHelloWorld.h" #include <stdio.h>
 
 // This is the non-static native method. Note that it receives 
                    a jobject
 // argument inthe second position.
 JNIEXPORT void JNICALL
 Java_javatech_jni22_JNIHelloWorld_nativeHelloWorld
 (JNIEnv *, jobject)
 {
 printf ("   Hello World (non-static)\n");
 return;
 }
 
 // The static native method receives a jclass variable in 
                    the second position.
 JNIEXPORT void JNICALL
 Java_javatech_jni22_JNIHelloWorld_nativeHelloWorldStatic
 (JNIEnv *, jclass)
 {
 printf ("   Hello World (static)\n");
 return;
 }
 |   
                  | NativeString.cpp |   
                  | #include 
                    "javatech_jni22_StringExample.h" #include <stdio.h>
 #include <string.h>
 
 JNIEXPORT jstring JNICALL
 Java_javatech_jni22_StringExample_nativeProcessString
 (JNIEnv *jenv, jobject jo, jstring js)
 {
 // Get jstring into C string format.
 const char* cs = jenv->GetStringUTFChars (js, 
                    NULL);
 char *cstring = new char [strlen (cs) + 1]; // 
                    +1 for null terminator
 sprintf (cstring, "%s", cs);
 jenv->ReleaseStringUTFChars (js, cs);
 
 // Reverse the order of characters.
 int len = strlen (cstring);
 char *reverse = new char [len+1]; // + 1 for null 
                    terminator
 for (int i=0; i < len; i++)
 reverse[i] = cstring[len-i-1];
 reverse[len] = 0; // null terminate
 
 // Create a new jstring for return.
 jstring jreverse = jenv->NewStringUTF (reverse);
 return jreverse;
 } // nativeProcessString
 
 |   
                  | NativeArray.cpp |   
                  |  #include 
                      "javatech_jni22_ArrayExample.h"
 JNIEXPORT jfloat JNICALL
 Java_javatech_jni22_ArrayExample_nativeProcessArray
 (JNIEnv *jenv, jobject, jfloatArray the_jarray, 
                      jint j_index)
 {
 float* c_array = jenv->GetFloatArrayElements 
                      (the_jarray, NULL);
 c_array[3] = -999.f;
 int c_index = j_index;
 float element = c_array[c_index];
 jenv->ReleaseFloatArrayElements (the_jarray, 
                      c_array, 0);
 jfloat jelement = element;
 return jelement;
 } // nativeProcessArray
 
 JNIEXPORT jint JNICALL
 Java_javatech_jni22_ArrayExample_nativeProcessArrayRegion
 (JNIEnv *jenv, jobject, jintArray the_jarray)
 {
 jint region[10];
 jint sum = 0;
 jenv->GetIntArrayRegion (the_jarray, 5, 10, 
                      region);
 for (int i=0; i < 10; i++)
 sum += region[i];
 return sum;
 } // nativeProcessArrayRegion
 
 JNIEXPORT void JNICALL
 Java_javatech_jni22_ArrayExample_nativeModifyArrayRegion
 (JNIEnv *jenv, jobject, jintArray the_jarray)
 {
 jint region[10];
 for (int i=0; i < 10; i++)
 region[i] = -5 - i;
 jenv->SetIntArrayRegion (the_jarray, 5, 10, 
                      region);
 } // nativeProcessArrayRegion
 
 JNIEXPORT void JNICALL
 Java_javatech_jni22_ArrayExample_nativeProcess2DArray
 (JNIEnv *jenv, jobject, jobjectArray joa2d)
 {
 // Get the length of the 2D array
 jint len1 = jenv->GetArrayLength (joa2d);
 // Extract the 0-th element from the 2D array 
                      and cast into a jintArray
 jintArray i2d_0 = (jintArray) jenv->GetObjectArrayElement 
                      (joa2d, 0);
 // Get the length of the extracted 1D array
 jint len2 = jenv->GetArrayLength (i2d_0);
 
 // Allocate a buffer to receive a copy of the 
                      elements from the 1D array
 jint buffer[4];
 // Copy the all of the elements of the entire 
                      1D array into the buffer
 jenv->GetIntArrayRegion (i2d_0, 0, 4, buffer);
 // Modify them in some way.
 for (int i=0; i < 4; i++)
 buffer[i]*=2;
 // Insert the modified buffer back into the 
                      1D array.
 jenv->SetIntArrayRegion (i2d_0, 0, 4, buffer);
 } // nativeProcessArrayRegion
 |        Most recent update: Oct. 14, 2005 |