「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」と表示されれば終わり。
相当雑な感じですが、以上です。