第115回 ネイティブアプリケーションからJavaVMを実行する
JNIではネイティブメソッドを実装するためのAPIだけでなくJavaVMを作成するAPIも用意されています。 これによりJavaプログラムをネイティブアプリケーションから実行することができます。
ではこのAPIを用いてネイティブアプリケーションからJavaVMを作成してHelloWorldを表示してみましょう。
hello.c: #include int main(int argc, char *argv[]) { JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; jclass System, PrintStream; jfieldID fid_out; jobject out; jmethodID mid_println; jstring message; vm_args.version = JNI_VERSION_1_6; /* 使用するJVMのバージョン */ JNI_GetDefaultJavaVMInitArgs(&vm_args); /* JVMのオプションをデフォルト値に初期化 */ JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args); /* JVMを作成 */ /* java.lang.System.out.println("Hello, World!"); 相当のコードをJNIで実行 */ System = (*env)->FindClass(env,"java/lang/System"); fid_out = (*env)->GetStaticFieldID(env, System, "out", "Ljava/io/PrintStream;"); (*env)->ExceptionDescribe(env); out = (*env)->GetStaticObjectField(env, System, fid_out); PrintStream = (*env)->FindClass(env, "java/io/PrintStream"); mid_println = (*env)->GetMethodID(env, PrintStream, "println", "(Ljava/lang/String;)V"); message = (*env)->NewStringUTF(env, "Hello, World!"); (*env)->CallVoidMethod(env, out, mid_println, message); (*jvm)->DestroyJavaVM(jvm); /* JVMを破棄 */ return 0; }
このプログラムをコンパイルして実行すると「Hello, World!」という文字列がコンソールに出力されます。