有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Windows JNI JNI_CreateJavaVM上加载多个JAR

我在我的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

我想还有另一个选择我没有考虑,但这让我发疯


共 (2) 个答案

  1. # 1 楼答案

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

  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() );
            .....