1 // Purpose. Java calling C referencing Java attributes 2 // (Java passes object in, C gets/sets attributes of object) 3 ////////////////////////////// JNIdemos.java \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 4 class JNIdemos { 5 private double balance = 100; 6 private double interest = .05; 7 static { 8 System.loadLibrary( "JNIdemos" ); 9 } 10 public double getBalance() { 11 return balance; 12 } 13 public native void compound(); 14 public static void main( String[] args ) { 15 JNIdemos account = new JNIdemos(); 16 System.out.println( "balance was " + account.getBalance() ); 17 account.compound(); 18 System.out.println( "balance is " + account.getBalance() ); 19 } 20 } 21 ////////////////////////////// JNIdemos.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 22 #include 23 #include "JNIdemos.h" 24 extern "C" { 25 JNIEXPORT void JNICALL Java_JNIdemos_compound( JNIEnv* env, 26 jobject this_ptr ) { 27 jclass accountClass = env->GetObjectClass( this_ptr ); 28 jfieldID balanceId = env->GetFieldID( accountClass, "balance", "D" ); 29 jdouble balance = env->GetDoubleField( this_ptr, balanceId ); 30 jfieldID interestId = env->GetFieldID( accountClass, "interest", "D" ); 31 jdouble interest = env->GetDoubleField( this_ptr, interestId ); 32 balance += balance * interest; 33 env->SetDoubleField( this_ptr, balanceId, balance ); 34 } 35 } 36 // C:> java JNIdemos 37 // balance was 100.0 38 // balance is 105.0