プロジェクト設定
適当にプロジェクト(ソリューション)を追加、新規作成します。
プロジェクト、プロパティ、C++の「追加のインクルードディレクトリ」に
"$(JAVA_HOME)\include";"$(JAVA_HOME)\include\win32"
を追記します。
これでjvm.hをインクルードできます。
(スタティックリンクしてしまう場合はプロパティ、リンカーの「追加のライブラリディレクトリ」に"$(JAVA_HOME)\lib"を追記、リンカーの「入力」の部分に「jvm.lib」を追加します。)(2010の場合は「VC++ディレクトリ」という設定にすることもできます。詳しくは知りませんが要するにヘッダーファイルとライブラリファイルがちゃんと読めれば良いはずです)
あとPATHは整理しておきましょう(PATHの中にjava.exeへのパスが沢山あるのは一般的に良くないです)。
jvm.dllを動的ロードしてJavaVMオブジェクトを作るサンプルコード。
typedef std::basic_string<_TCHAR> tstring;
tstring jvmDll = _T("C:\\JAVA_HOME\\java\\jre\\bin\\client\\jvm.dll"); HINSTANCE jvmDllModule = LoadLibrary(jvmDll.c_str()); if (jvmDllModule == NULL) { throw wtjava::DLL_LOAD_ERR; } int (__stdcall * createJavaVM)(JavaVM **, void **, void *); createJavaVM = (int (__stdcall *)(JavaVM **, void **, void *)) GetProcAddress(jvmDllModule, "JNI_CreateJavaVM"); JavaVM* jvm = NULL; JNIEnv* env = NULL; int status; try { JavaVMInitArgs vm_args; status = createJavaVM(&jvm, (void**)&env, &vm_args); } catch (...) { }このあとjvmとenvでjavaを実行できます。 JNIを使うネイティブアプリは起動時にJavaのホームディレクトリを指定するか読込んでjvm.dllを動的ロードすることが多いと思います。
x64版
動的ロードの場合は特に設定はいらないと思います。スタティックリンクの場合は、32ビット版のビルドのためには32版JDKが必要で、64ビット版のビルドには64ビット版JDKが必要です。両方のバイナリが必要なら両方のJDKを揃えて、プロジェクトのプラットフォーム別に設定を変えるだけです。
ヘッダーファイルは共通です(たぶん)。
jarライブラリを読み込んで起動
JavaVM起動オプションはJavaVMOptionの配列を作ってJavaVMInitArgsに一つずつ設定します。以下jarライブラリを読み込んで起動する例です。(vm_args.versionで、Javaバージョン1.6相当で起動、vm_args.ignoreUnrecognizedで間違った起動オプションでは起動しないようにしています)
このように設定したvm_argsでcreateJavaVM()を実行すると良いはずです。
JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=.;c:\\java_lib\\library.jar;"; JavaVMInitArgs vm_args; vm_args.options = options; vm_args.nOptions = 1; vm_args.version = JNI_VERSION_1_6; vm_args.ignoreUnrecognized = JNI_TRUE;ちなみに「.\」の指す場所が分からなくて困ると思います。 ビルド後に実行するときは、実行ファイルのある場所ですが、デバッグ実行の場合プロジェクトのディレクトリになっています(実行ファイルのある場所ではなく)。 よく分からなかったら(windows.h?をインクルードして)「system("dir");」とやるとデバッグ中の「.\」の場所が分かると思います。 なんとショートカットから起動した場合「.\」はショートカットのある場所になってしまいます。
結局のところDLLやexeファイルのある場所を取得して絶対パスを生成するのが良いです。
0 件のコメント:
コメントを投稿