JNI用のプロジェクトを作ってJavaVMを起動する

>JNIの使い方

プロジェクト設定


適当にプロジェクト(ソリューション)を追加、新規作成します。
プロジェクト、プロパティ、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<_TCHARtstring;
   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 件のコメント:

コメントを投稿