- - PR -
JNIのFindClass()でクラス検索に失敗してしまいます。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-11-26 11:08
お世話になっております。
Java初心者です。 現在、VC++6.0からJNIでhoge.jar内の関数をコールしたいのですが、 hoge.jar内のclassがFindClass()で検索できません。(NULL応答) 以下の設定以外に不足している、間違っている設定等ご存知でしたら ご教授頂けないでしょうか。 OS: WindowsXP hoge.jar解凍情報: META-INF/xxx.MF jp/co/xxx.class jp/co/yyy.class jp/co/system.class ↑上記system.class内のSYSTEM クラスを検索したい。 環境変数: CLASSPATH:C:\Temp\hoge.jar;%JAVA_HOME%\jre\lib\ext; JAVA_HOME:C:\Program Files\Java\jdk1.6.0_10; Path :%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin\client;%JAVA_HOME%\jre\bin; 実行環境: C:\Temp\hoge.exe C:\Temp\hoge.jar hoge.exeソース抜粋:※エラーチェックは抜いています //--- JavaVMの生成 ---// JNIEnv *jnienv; JavaVM *javavm; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = 1; vm_args.ignoreUnrecognized = true; JNI_CreateJavaVM(&javavm, (void **)&jnienv, &vm_args); 別スレッドからの呼び出し。 //--- JNIEnvのアタッチ処理 ---// jsize nVMs; jsize bufLen = 1; JavaVM* vm; JNIEnv* jnienv; JNI_GetCreatedJavaVMs(&vm, bufLen, &nVMs); vm->AttachCurrentThread(reinterpret_cast<void**>(&jnienv), NULL); // jclass cls = jnienv->FindClass("SYSTEM"); // NG // jclass cls = jnienv->FindClass("jp/co/SYSTEM"); // NG jclass cls = jnienv->FindClass("Ljp/co/SYSTEM;"); // NG if(cls == NULL){ //--- ※ここでクラスの検索に失敗 ---// AfxMessageBox("クラス検索に失敗しました。"); } hoge.exe実行結果: "クラス検索に失敗しました。" と出力されてしまいます。 | ||||||||
|
投稿日時: 2008-11-26 13:37
system 内に SYSTEM クラスが存在するのですか? 試しに
とすると、どうなりますか? | ||||||||
|
投稿日時: 2008-11-26 13:51
回答ありがとうございます。
上記のコードをさっそく試してみましたが、結果の方は変わらずでした。 system 内に SYSTEM クラスが存在するのですか? ⇒はい、上記の通りでSYSTEMクラスが存在致します。 現在は、下記コードのパス指定方法を変えて調査しているのですが、 進展していない状況です。。 options[0].optionString = "-Djava.class.path=."; | ||||||||
|
投稿日時: 2008-11-26 16:36
わたしは、Java側 から呼び出す JNI 関数しか 作ったことがないので
はずしているかもしれませんが、 vm_args.version に VM にサポートさせたい JNI バージョンに設定してから、 JNI_GetDefaultJavaVMInitArgs () を呼び出して、 Java VM のデフォルト構成を返してもらってはいかがでしょうか ? | ||||||||
|
投稿日時: 2008-11-26 19:43
yos様回答ありがとうございます。
下記、試してみました。 vm_args.version に VM にサポートさせたい JNI バージョンに設定してから、 JNI_GetDefaultJavaVMInitArgs () を呼び出して、 Java VM のデフォルト構成を返してもらってはいかがでしょうか ? 上記ソースコードを追加し、私の方でも、環境面の修正を行ったところ、 hoge.jarからクラス検索ができるまでには至っておりませんが、 exeのカレントディレクトリにhoge.jarを解凍した"jp/co/system.class"を置くことにより、 SYSTEMクラスのFindClass()が成功するところまでできました。 引き続き、hoge.jarを解凍しないでもFindClass()が成功できる方法を調査しております。 | ||||||||
|
投稿日時: 2008-11-26 22:14
こんばんは。
恐らくですが… クラスパスが設定できていないんでしょう。 環境変数CLASSPATHを取得して -> getenv("CLASSPATH") vm_args.optionsに追加 "-Djava.class.path=クラスパス" JARファイルのパスも追加 "-Djava.class.path=JARファイルパス" JDKってソース公開されていますよね!? [追加] ここに↓ http://download.java.net/jdk6/6u3/promoted/b05/index.html [/追加] 自分でJVMを起動して実行したいのであれば "java"コマンドラインツールのソースが参考になると思います。 このソース↓ /j2se/src/share/bin/java.c [ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2008-11-26 22:55 ] | ||||||||
|
投稿日時: 2008-11-28 19:52
Tdnr_Sym様回答ありがとうございます。
今、ようやくクラスパスの取得ができました! 原因は、基本的すぎて恥ずかしいのですが、、 options[1].optionString = "-Djava.class.path△=△JARファイルパス" △(スペース)が入っていました。。 スペースが入ると無効になってしまうのですね。。 yos様、Tdnr_Sym様貴重な時間を割いて回答していただき 本当にありがとうございました。 |
1