「Java」C から Java の呼び出し

C から Java の呼び出しを行なってみたので、その時のメモ。

[ 環境情報 ]
CentOS 6.2
Java SE 7 Update 21
GCC 4.4.7

1. Java プログラムの作成

public class Test {
  public static void hello() {
    System.out.println("hello");
  }
}

コンパイルして .class ファイルにしておく。

2. C プログラムの作成

#include "jni.h"

int main()
{
    JNIEnv  *env;
    JavaVM  *jvm;
    int     res;
    jclass  cls;
    jmethodID mid;

    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=.";

    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 1;

    res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
    if (res < 0) {
        fprintf(stderr, "JNI_CreateJavaVM error\n");
        return -1;
    }

    cls = (*env)->FindClass(env, "Test");
    if (cls == 0) {
          printf("Not Find Test Class\n");
        return -1;
    }

	mid = (*env)->GetStaticMethodID(env, cls, "hello", "()V");
    if (mid == 0) {
          printf("Not Find hello Method\n");
        return -1;
    }
	(*env)->CallStaticVoidMethod(env, cls, mid, NULL);
	
    (*jvm)->DestroyJavaVM(jvm);
    return 0;
}


3. 実行ファイルの作成

インクルードファイルに "jni.h"、"jni_md.h" が、"libjvm.so" をリンクする必要があるみたいなので、コンパイルは以下のコマンドで行なう。

gcc -I /usr/local/java/jdk1.7.0_21/include/ -I /usr/local/java/jdk1.7.0_21/include/linux/ -L /usr/local/java/jdk1.7.0_21/jre/lib/i386/server/ -ljvm -o main main.c


4. 環境変数 LD_LIBRARY_PATH の設定

export LD_LIBRARY_PATH=/usr/local/java/jdk1.7.0_21/jre/lib/i386/server/


上記で作業は完了。"./main" として「hello」と表示されれば終わり。


相当雑な感じですが、以上です。