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

