CからJavaを呼び出す(書きかけ中)
CからJavaを呼び出すのに苦労している。作業途中だがメモしておく。
#include <jni.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { JNIEnv *env; JavaVM *jvm; JNIEnv jni; JavaVM vmi; JavaVMInitArgs vm_args; JavaVMOption options[4]; printf("beginning execution...?n"); /* * /opt/blackdown-jdk-1.4.2/がJavaのルートディレクトリの場合 */ options[0].optionString = (char *) "-Djava.class.path=.:/opt/blackdown-jdk-1.4.2/jre/lib/rt.jar"; options[1].optionString = (char *) "-Djava.compiler=NONE"; vm_args.version = JNI_VERSION_1_4; vm_args.options = options; vm_args.nOptions = 2; vm_args.ignoreUnrecognized = JNI_FALSE; /* * JavaVMを初期化,起動する * JNIインターフェースへのポインタを返す */ JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); jni = *env; vmi = *jvm; /* * クラスをさがす */ jclass cls = jni->FindClass(env, "Test"); if (cls == 0) { printf("cannot found Test?n"); exit(1); } /* * Methodをさがす * GetStaticMethodIDの引数については後述 */ jmethodID mid = jni->GetStaticMethodID(env, cls, "testmethod", "()V"); if (mid == 0) { printf("Could not locate method testmthod with signature ()V"); exit(1); } /* * 実行 */ jni->CallStaticVoidMethod(env, cls, mid, NULL); /* * VMを終了する */ vmi->DestroyJavaVM(jvm); return 0; }
2.ビルド時に「undefined reference to `_imp__JNI_CreateJavaVM@12'」というエラーが発生した
3.エラーを解消するために、リンカオプションおよびディレクトリ検索オプションに、jvm.libとそこへのパスを指定する。
Cのプロジェクトを選択→右クリック→プロパティ→C/C++ Build→Settings→MinGW C Linkerと辿って指定する。
文字列として認識させるために、ダブルクォーテーション(”)で囲って設定する必要があることに注意する。