1 // Purpose. Java calling C calling Java 2 // (Java passes object in, C++ object created, C++ object calls 3 // Java, Java returns String) 4 ////////////////////////////// JNIdemos.java \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 5 import java.awt.event.*; 6 import javax.swing.*; 7 class JNIdemos { 8 private JFrame f; 9 static { 10 System.loadLibrary( "JNIdemos" ); 11 } 12 public JNIdemos() { 13 f = new JFrame( "JNI demo" ); 14 f.addWindowListener( new WindowAdapter() { 15 public void windowClosing( WindowEvent e ) { System.exit(0); } } ); 16 f.getContentPane().add( new JLabel( "The parent window" ) ); 17 f.pack(); 18 f.setVisible( true ); 19 startCpp(); 20 // startCpp( this ); 21 } 22 public String getInput() { 23 System.out.println( "java: fetching input" ); 24 String str = JOptionPane.showInputDialog( f, "Enter something" ); 25 return str; 26 } 27 public native void startCpp(); 28 // public native void startCpp( JNIdemos in ); 29 public static void main( String[] args ) { 30 new JNIdemos(); 31 } } 32 ////////////////////////////// JNIdemos.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 33 #include 34 #include "JNIdemos.h" 35 class DemoGUI { 36 public: 37 DemoGUI( jobject gui, JNIEnv* env ) { 38 jclass guiClass = env->GetObjectClass( gui ); 39 jmethodID getId = env->GetMethodID( guiClass, "getInput", 40 "()Ljava/lang/String;" ); 41 const char* strCpp; 42 jstring strJava; 43 for (int i=0; i < 3; i++) { 44 strJava = (jstring) env->CallObjectMethod( gui, getId ); 45 strCpp = env->GetStringUTFChars( strJava, 0 ); 46 cout << "cpp: input received --" << strCpp << "--" << endl; 47 env->ReleaseStringUTFChars( strJava, strCpp ); 48 } 49 } 50 }; 51 extern "C" { 52 JNIEXPORT void JNICALL Java_JNIdemos_startCpp( JNIEnv* env, jobject in ) { 53 new DemoGUI( in, env ); 54 } 55 } 56 // extern "C" { 57 // JNIEXPORT void JNICALL Java_JNIdemos_startCpp( JNIEnv* env, jobject, 58 // jobject in ) { 59 // new DemoGUI( in, env ); 60 // } 61 // } 62 // C:> java JNIdemos 63 // java: fetching input 64 // cpp: input received --first entry-- 65 // java: fetching input 66 // cpp: input received --second interaction-- 67 // java: fetching input 68 // cpp: input received --final input--