- PR -

JNIのFindClass()でクラス検索に失敗してしまいます。

1
投稿者投稿内容
えいぞ
会議室デビュー日: 2008/11/26
投稿数: 4
投稿日時: 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実行結果:
"クラス検索に失敗しました。"
と出力されてしまいます。
yos
常連さん
会議室デビュー日: 2004/08/24
投稿数: 27
投稿日時: 2008-11-26 13:37
引用:
jp/co/system.class
↑上記system.class内のSYSTEM クラスを検索したい。



system 内に SYSTEM クラスが存在するのですか?
試しに

コード:
jclass cls = jnienv->FindClass("Ljp/co/system;");


とすると、どうなりますか?


えいぞ
会議室デビュー日: 2008/11/26
投稿数: 4
投稿日時: 2008-11-26 13:51
回答ありがとうございます。

コード:
jclass cls = jnienv->FindClass("Ljp/co/system;");



上記のコードをさっそく試してみましたが、結果の方は変わらずでした。

system 内に SYSTEM クラスが存在するのですか?
⇒はい、上記の通りでSYSTEMクラスが存在致します。

現在は、下記コードのパス指定方法を変えて調査しているのですが、
進展していない状況です。。

options[0].optionString = "-Djava.class.path=.";
yos
常連さん
会議室デビュー日: 2004/08/24
投稿数: 27
投稿日時: 2008-11-26 16:36
わたしは、Java側 から呼び出す JNI 関数しか 作ったことがないので
はずしているかもしれませんが、

vm_args.version に VM にサポートさせたい JNI バージョンに設定してから、
JNI_GetDefaultJavaVMInitArgs () を呼び出して、
Java VM のデフォルト構成を返してもらってはいかがでしょうか ?
えいぞ
会議室デビュー日: 2008/11/26
投稿数: 4
投稿日時: 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()が成功できる方法を調査しております。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-11-26 22:14
こんばんは。

引用:

えいぞさんの書き込み (2008-11-26 11:08) より:
お世話になっております。
Java初心者です。

現在、VC++6.0からJNIでhoge.jar内の関数をコールしたいのですが、
hoge.jar内のclassがFindClass()で検索できません。(NULL応答)

以下の設定以外に不足している、間違っている設定等ご存知でしたら
ご教授頂けないでしょうか。



恐らくですが…
クラスパスが設定できていないんでしょう。

環境変数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/26
投稿数: 4
投稿日時: 2008-11-28 19:52
Tdnr_Sym様回答ありがとうございます。
今、ようやくクラスパスの取得ができました!

原因は、基本的すぎて恥ずかしいのですが、、
options[1].optionString = "-Djava.class.path△=△JARファイルパス"
△(スペース)が入っていました。。

スペースが入ると無効になってしまうのですね。。

yos様、Tdnr_Sym様貴重な時間を割いて回答していただき
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)