1 // Purpose. C calling Java 2 // (C creates JVM, C passes nothing, Java returns String) 3 // [see file:///C:/jdk1.2/docs/guide/jni/jni-12.html] 4 ////////////////////////////// JNIdemos.java \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 5 import java.awt.event.*; 6 import javax.swing.*; 7 class JNIdemos { 8 private JFrame f; 9 public JNIdemos() { 10 f = new JFrame( "JNI demo" ); 11 f.addWindowListener( new WindowAdapter() { 12 public void windowClosing( WindowEvent e ) { System.exit(0); } } ); 13 f.getContentPane().add( new JLabel( "The parent window" ) ); 14 f.pack(); 15 f.setVisible( true ); 16 } 17 public String getInput() { 18 System.out.println( "java: fetching input" ); 19 String str = JOptionPane.showInputDialog( f, "Enter something" ); 20 return str; 21 } 22 } 23 ////////////////////////////// JNIdemos.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 24 #include 25 #include 26 void main( void ) { 27 JavaVMOption options[2]; // arbitrary VM start-up strings 28 JavaVMInitArgs vm_args; // JVM initialization arguments 29 JavaVM* jvm; // pointer to receive JVM struct 30 JNIEnv* env; // pointer to receive JNI struct 31 // disable JIT 32 options[0].optionString = "-Djava.compiler=NONE"; 33 // CLASSPATH 34 options[1].optionString = "-Djava.class.path=c:\\jdk1.2\\vlh"; 35 // set native library path - had no effect (vlh) 36 // options[2].optionString = 37 // "-Djava.library.path=c:\\jdk1.2\\jre\\bin\\classic"; 38 // print JNI-related messages 39 // options[3].optionString = "-verbose:jni"; 40 vm_args.version = JNI_VERSION_1_2; 41 vm_args.options = options; 42 vm_args.nOptions = 2; 43 vm_args.ignoreUnrecognized = true; 44 int res = JNI_CreateJavaVM( &jvm, (void**) &env, &vm_args ); 45 if (res < 0) cout << "create failed" << endl; 46 jclass clas = env->FindClass( "JNIdemos" ); 47 jmethodID ctor = env->GetMethodID( clas, "", "()V" ); 48 jobject gui = env->NewObject( clas, ctor ); 49 jmethodID get = env->GetMethodID( clas, "getInput", 50 "()Ljava/lang/String;"); 51 const char* strCpp; 52 jstring strJava; 53 for (int i=0; i < 3; i++) { 54 strJava = (jstring) env->CallObjectMethod( gui, get ); 55 strCpp = env->GetStringUTFChars( strJava, 0 ); 56 cout << "cpp: input received --" << strCpp << "--" << endl; 57 env->ReleaseStringUTFChars( strJava, strCpp ); 58 } 59 jvm->DestroyJavaVM(); 60 } 61 // C:> jnidemos 62 // java: fetching input 63 // cpp: input received --first entry-- 64 // java: fetching input 65 // cpp: input received --second interaction-- 66 // java: fetching input 67 // cpp: input received --final input--