EeBlog(テクニカルブログ)

第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!」という文字列がコンソールに出力されます。