2

Windows 用の C++ アプリケーション内で JVM を作成していますが、複数の jar をロードするように説得できません。

私のC++コード:

MyClass::MyClass(std::string & classPath) {
    classPath = "-cp "+classPath;   // <--  Won't work with any path or single jar
    //classPath = "-Djava.class.path="+classPath; <-- Only works with single jar
    jvmOptions[0].optionString = (char *)classPath.c_str();
    jvmOptions[1].optionString = "-Xms8m";
    jvmOptions[2].optionString = "-Xmx24m";
    jvmArgs.version = JNI_VERSION_1_6;
    jvmArgs.options = jvmOptions;
    jvmArgs.nOptions = 3;
    jvmArgs.ignoreUnrecognized = JNI_TRUE;
    int jvmInitResult = CreateJavaVM( &jvm, (void**)&environment, &jvmArgs);

    if( jvmInitResult >= 0 ) {
        jclass loadedClass = environment->FindClass( MyClassName.c_str() );
          .....

変数を介してパスをclassPath単一の JAR などに渡す"C:\path\myjar.jar"と、jclass変数は問題なく配置されます。ただし、私の Java クラスが機能するには追加の JAR が必要なので、複数の JAR をjvmOptions. 次のいずれかの方法で 2 番目または 3 番目の JAR を渡そうとすると、FindClass呼び出しが失敗するようになりました。

C:\path\myjar.jar    <--------- FindClass SUCCESS; can't use due to missing jars
C:\path\myjar.jar;C:\path\secondjar.jar  <-----FindClass FAIL
C:\path\myjar.jar:C:\path\secondjar.jar  <-----FindClass FAIL
C:\path\*  <-----FindClass FAIL
C:\path\*.jar  <-----FindClass FAIL
"C:\path\myjar.jar;C:\path\secondjar.jar"  <-----FindClass FAIL
"C:\path\myjar.jar:C:\path\secondjar.jar"  <-----FindClass FAIL

私が考えていない別のオプションがあると思いますが、これは私を狂わせています。

4

2 に答える 2

2

-cpクラスパスを設定するために使用する必要があります。私-Djava.class.path=はあなたがそうすべきだと思うことをしないと思います。

于 2013-09-27T21:11:23.860 に答える
2

解決策は、引数をプログラムに渡すときに Windows のファイル セパレータを使用しないことです。\ は、1 つ以上の \ でエスケープ シーケンスを取得することになります。引数を UNIX スタイルのファイル セパレータに変更すると、ディレクトリ内のすべての jar が正しくロードされます。

例えば:

MyApp "classpath"
MyApp C:\pathtojars\  <-- fails
MyApp C:/pathtojars/  <-- works

固定コード:

MyClass::MyClass(std::string & classPath )
{
   classPath = "-Djava.class.path="+classPath;
   jvmOptions[0].optionString = (char *)classPath.c_str();
   jvmOptions[1].optionString = "-Xms8m";
   jvmOptions[2].optionString = "-Xmx24m";
   jvmArgs.version = JNI_VERSION_1_6;
   jvmArgs.options = jvmOptions;
   jvmArgs.nOptions = 3;
   jvmArgs.ignoreUnrecognized = JNI_TRUE;
   int jvmInitResult = CreateJavaVM( &jvm, (void**)&environment, &jvmArgs);

   if( jvmInitResult >= 0 )
   {
       jclass loadedClass = environment->FindClass( MyClassName.c_str() );
        .....
于 2013-09-30T15:39:46.743 に答える