C++ から Java JVM を起動したい

[戻る]
vs javac 2008/07/18(金) 12:52:39
Java のVMをC++から起動したいのですができません。
(以前、JavaからCを呼ぶことはできました。)
下のコードはJavaのドキュメントを読んで、コピーしたものです。
JNIについてのHPはたくさんありましたから一応目をとおしました。
WinXP+SP3 VS2005でビルドができて実行できますが、
JVM の起動に失敗します。
jvm.dll jvm.lib をプロジェクトに加えています。
どうしたらよいでしょうか?
//------------------------------------------
実行結果です。
JavaVMを作成開始.
result = -1  JavaVMの作成に失敗しました
続行するには何かキーを押してください . . .
//-----------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;
//---------------------------
#include "jni.h"
//----------------------------------
int _tmain(int argc, _TCHAR* argv[])
{ 
    JNIEnv *jnienv; 
    JavaVM *javavm;    
    //---------------------------------
    JavaVMOption options[4];
    
    options[0].optionString = "-Djava.compiler=NONE";           
    /* disable JIT */
    options[1].optionString = "-Djava.class.path=."; 
    /* user classes */
    options[2].optionString = "-Djava.library.path=.\\JVM_1.4\\lib";  
    /* set native library path */
    options[3].optionString = "-verbose:jni";                  
    /* print JNI-related messages */ 
    //----------------------------------------------
    JavaVMInitArgs vm_args;

    vm_args.version = JNI_VERSION_1_4;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;
    //---------------------------------------------
    cout << "JavaVMを作成開始.\n"; 
    int result = JNI_CreateJavaVM(&javavm, (void **)&jnienv, &vm_args);

     if(0==result){ cout << "JavaVMの作成 成功!" << endl; }
     else{
        cout << "result = " << result  << "  JavaVMの作成に失敗しまし
た"<< endl;
         return 1;
    }
    //--------------------------------------
    cout << "JavaVMを破棄.\n";
    result = javavm->DestroyJavaVM();

    if(0==result)
    {
         cout << "JavaVMの破棄に成功" << endl;
        return 0;        
    }
    else {
        cout << "result=" << result << ",  JavaVMの破棄に失敗しました" << 
endl; 
        return result;
    }
}
//--------------------------------------------

nowhere 2008/07/22(火) 11:45:23
実際に使ったことはないので良く分からないのですが、軽くぐぐってみた&読んでみた感
想だけでいうと、

> vm_args.nOptions = 1;
でオプション配列数が4つなのにもかかわらず、オプションの配列数を1にしている為、
2個目以降のオプションが認識できず起動できていない、ということはないでしょうか?
ここを4にしてみたらどうなりますか?

また、PATHの通っているところにjvm.dllがありますか?
VisualStudio上から起動した場合は実行ファイルが存在するところと起動ディレクトリは
異なる可能性もありますから、プロジェクト>プロパティ>構成プロパティ>デバック>
作業ディレクトリ(VisualStudio2005の場合)を確認してみてください。

vs javac 2008/07/24(木) 08:15:21
返信ありがとう御座います。

>> vm_args.nOptions = 1;
>> でオプション配列数が4つなのにもかかわらず、オプションの配列数を1にしている
>> 為、2個目以降のオプションが認識できず起動できていない、ということはないでし
>> ょうか? ここを4にしてみたらどうなりますか?

同じく -1 が返り起動できませんでした。 
ためしに、でたらめな 9 を書くと異常終了しました。

>> PATHの通っているところにjvm.dllがありますか?
ありません。 
jvm.dll, jvm.lib, jni.h, jni_md.h はプロジェクト内にコピーしてあります。
プロジェクトに加えてます。 未定義の関数、リンクできないなどのエラーにならず
ビルドができて、実行できているのでコンパイラはJavaの各ファイルを認識していると
思います。
JNI用の環境変数を設定したというHPを確かに見ています。
一応ためしてみようかなとは思いますがまだ行っていません。

>> VisualStudio上から起動した場合は実行ファイルが存在するところと起動ディレクト
>> リは 異なる可能性もありますから、プロジェクト>プロパティ>構成プロパティ>
デバック> 作業ディレクトリ(VisualStudio2005の場合)を確認してみてください。

このことで別のプロジェクトで困った経験があるので考慮しているつもりです。

調べると空白になっているので、VSから起動した場合の起動ディレクトリは、
実行ファイルが存在するところではなくて、プロジェクトファイルのある
トップのディレクトリであると承知しています。

JNIに関するHPはソースコード付きでたくさんさまざまあります。
なんでも試してみるつもりです。 まだできません。

うっちー 2008/07/25(金) 16:37:50
コードからのみで、気付いた点を書いてみます。

・vm_args.nOptionsにはoptionsのサイズを指定。

・JNI_CreateJavaVM()の前に
 JNI_GetDefaultJavaVMInitArgs()を呼ぶ。

古いスレッドには追加発言できません。