2

我正在我的 C++ 应用程序中为 Windows 创建一个 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. 当我尝试通过以下任何一种方式传递第二个或第三个 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

解决方案是在将参数传递给程序时不使用 windows 文件分隔符。\ 最终得到一个或多个 \ 的转义序列。将参数更改为 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 回答
2

您应该使用-cp来设置类路径。我怀疑-Djava.class.path=不会做你认为应该做的事。

于 2013-09-27T21:11:23.860 回答