- PR -

「JVM起動を含むDLLをVC++で呼ぶ」について

1
投稿者投稿内容
加藤
会議室デビュー日: 2007/07/04
投稿数: 3
投稿日時: 2007-07-04 17:50
JVM起動とjava(jar)を呼び出す処理を含むDLLを
VC++で呼ぶことは可能でしょうか?
DLLはLoadLibraryで読み込んでいるようですが
DLL内のJNI_CreateJavaVMで処理が止まっているようです。

復帰コード等、取得できていないため
載せることはできませんが(-1)のようです。


〜〜〜ここからDLL〜〜〜〜〜〜〜〜〜〜〜〜
int main(argc, argv)
int argc;
char** argv;
{
JavaVM *jvm;
JNIEnv *env;

JavaVMInitArgs vm_args;
JavaVMOption options[4];
vm_args.version = JNI_VERSION_1_4;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.;activation.jar";
options[2].optionString = "-Djava.library.path ="JavaのLibのパス";
options[3].optionString = "-verbose:jni";
vm_args.options = options;
vm_args.nOptions = 3;
vm_args.ignoreUnrecognized = JNI_TRUE;
nResult = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if ( nResult != 0 ) {
printf("ERROR[%ld]\\n", nResult);←出ない
}
〜〜〜ここまでDLL〜〜〜〜〜〜〜〜〜〜〜〜

〜〜〜ここからVC++呼び出し元〜〜〜〜〜〜〜〜〜〜〜〜
#include "Pdmstage_Api.h"

HINSTANCE hDll;
int ( __stdcall *OKiHo)(int,char**);

void main(void)
{
int argc = 7;
char* argv[a][b] ={"a","b","c","d","e","f","g"};

hDll = LoadLibrary("Pdmstage_Api.dll");
if( ! hDll ){
return;
}

OKiHo = (int(__stdcall*)(int,char**))GetProcAddress(hDll,"main");
if( ! OKiHo ){
FreeLibrary( hDll );
return;
}

int iRet = OKiHo(argc, *argv);
if (iRet != 0) {
FreeLibrary( hDll );
return;
}
FreeLibrary( hDll );
}
〜〜〜ここまでVC++呼び出し元〜〜〜〜〜〜〜〜〜〜〜〜

長くてすみません。
意味が通じなかったらすみません。
何卒よろしくお願いします。


環境
WinXpPro
VC++6.0
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)
加藤
会議室デビュー日: 2007/07/04
投稿数: 3
投稿日時: 2007-07-04 17:57
補足です。
コマンドプロンプト(DOS窓)では
正常に動作します。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-05 07:36
たぶん、外部プロセスの起動あたりでぐぐると大体の記述がみえてくるとおもいます。


VC++ でJavaを呼び出したいとのことですので。別の会議室のほうが回答をえられるかもです。
加藤
会議室デビュー日: 2007/07/04
投稿数: 3
投稿日時: 2007-07-05 08:59
失礼いたしました。
別を探します。
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2007-07-08 23:02
JavaVMの起動についてであれば、別の会議室で回答を得られる可能性は薄いと思います。
(今回の問題が単にDLLの呼び出し方であれば別ですが・・・)

DLL側とEXE側で同じ名前のmainを使って問題なかったでしょうか。
DLL側で外部から呼ばれる関数には、declspec(dllexport)といった指定を記述するか、
DEFファイルのEXPORTSで指定しておく必要があると思います。

コマンドプロンプトでは動作するとありますが、上述の疑問に対する解決をサンプル
コードから読み取れないので、どこがどう問題か検証しづらい状況ですね。


1

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