Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上加载多个JAR-JNI JNI_CreateJavaVM 我在我的C++应用程序中为Windows创建了一个JVM,我无法说服它加载多个JARS。 我的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() ); ....._Java_C++_Jar_Java Native Interface_Classpath - Fatal编程技术网

在Windows上加载多个JAR-JNI JNI_CreateJavaVM 我在我的C++应用程序中为Windows创建了一个JVM,我无法说服它加载多个JARS。 我的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() ); .....

在Windows上加载多个JAR-JNI JNI_CreateJavaVM 我在我的C++应用程序中为Windows创建了一个JVM,我无法说服它加载多个JARS。 我的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() ); .....,java,c++,jar,java-native-interface,classpath,Java,C++,Jar,Java Native Interface,Classpath,我假设还有另一个我没有想到的选项,但这让我抓狂。您应该使用-cp来设置类路径。我怀疑-Djava.class.path=不会执行您认为应该执行的操作。您应该使用-cp设置类路径。我怀疑-Djava.class.path=不会执行您认为应该执行的操作。解决方案是在将参数传递给程序时不使用windows文件分隔符。\最终以一个或多个\进行转义排序。将参数更改为unix样式的文件分隔符将正确加载目录中的所有JAR 例如: 解决方案是在向程序传递参数时不使用windows文件分隔符。\最终以一个或多个\

我假设还有另一个我没有想到的选项,但这让我抓狂。

您应该使用
-cp
来设置类路径。我怀疑
-Djava.class.path=
不会执行您认为应该执行的操作。

您应该使用
-cp
设置类路径。我怀疑
-Djava.class.path=
不会执行您认为应该执行的操作。

解决方案是在将参数传递给程序时不使用windows文件分隔符。\最终以一个或多个\进行转义排序。将参数更改为unix样式的文件分隔符将正确加载目录中的所有JAR

例如:


解决方案是在向程序传递参数时不使用windows文件分隔符。\最终以一个或多个\进行转义排序。将参数更改为unix样式的文件分隔符将正确加载目录中的所有JAR

例如:



JVM选项[0]。选项字符串=(char*)(“-Djava.class.path=“+classPath”).c_str()-首先,你不想修改它,其次,指针在那条语句后摆动。我同意,这一步是暂时的,但我需要一种快速的动态方式来更改它,而无需重新编译,同时找到正确的格式。变量作为命令行参数传入。注释的@chris行永远不会工作,因为
“-Djava.class.path=“+classPath
将创建一个临时
std::string
,该行在该语句结束时被销毁<代码>JVM选项[0]。选项字符串
指向其上的无效内存。也许你想使用
classPath.insert(…)
来代替。我已经编辑了上面的内容来删除临时字符串
JVMPoptions[0]。optionString=(char*)(“-Djava.class.path=“+classPath”).c_str()-首先,你不想修改它,其次,指针在那条语句后摆动。我同意,这一步是暂时的,但我需要一种快速的动态方式来更改它,而无需重新编译,同时找到正确的格式。变量作为命令行参数传入。注释的@chris行永远不会工作,因为
“-Djava.class.path=“+classPath
将创建一个临时
std::string
,该行在该语句结束时被销毁<代码>JVM选项[0]。选项字符串
指向其上的无效内存。也许你想用
classPath.insert(…)
来代替。我已经编辑了上面的内容来删除临时字符串,并将其切换到-cp,仍然无法使用<代码>类路径=“-cp”+类路径;JVM选项[0]。选项字符串=(char*)类路径。c_str()@Samhain
-cp
类路径
是两个参数。修改为传递4个JVM选项,第一个是-cp,第二个是指向我的jar的路径,或者指向jar的路径。没有成功<代码>JVM选项[0]。选项字符串=“-cp”;JVM选项[1]。选项字符串=(char*)类路径。c_str();JVM选项[2]。选项字符串=“-Xms8m”;JVM选项[3]。选项字符串=“-Xmx24m”解决了问题。当通过命令行参数传递类路径时,由于windows的文件分隔符:\,正在使用它。如果使用-Djava.class.path=选项,并使用unix样式的文件分隔符/,则所有内容都可以正常工作,并且目录中的所有JAR都可以顺利加载。感谢您的帮助。@Samhain在下面看到我的评论,我不认为使用
“/”
而不是
“\”
真的有助于将其切换到-cp,但仍然无法执行<代码>类路径=“-cp”+类路径;JVM选项[0]。选项字符串=(char*)类路径。c_str()@Samhain
-cp
类路径
是两个参数。修改为传递4个JVM选项,第一个是-cp,第二个是指向我的jar的路径,或者指向jar的路径。没有成功<代码>JVM选项[0]。选项字符串=“-cp”;JVM选项[1]。选项字符串=(char*)类路径。c_str();JVM选项[2]。选项字符串=“-Xms8m”;JVM选项[3]。选项字符串=“-Xmx24m”解决了问题。当通过命令行参数传递类路径时,由于windows的文件分隔符:\,正在使用它。如果使用-Djava.class.path=选项,并使用unix样式的文件分隔符/,则所有内容都可以正常工作,并且目录中的所有JAR都可以顺利加载。感谢您的帮助。@Samhain在下面看到我的评论,我不认为使用
“/”
而不是
“\”
真的有帮助。事实上,我不认为使用
/
真的是解决方法。我目前在一个包含通配符的类路径上遇到问题,Google将我带到这个网页。我确信的是使用
-cp
不起作用,使用
*
(包含所有jar的通配符)不起作用,而且
“/”
“\”
在Windows上都起作用。我已经用Java6、7和8对此进行了测试。但是如果您直接在C/C++字符串中使用
“\”
,请不要忘记保护它:
“dir\\file”
vs
“dir\file”
。至于
*
,似乎应该手动展开,请参见
java.c
@xav中的
JLI_WildcardExpandClasspath()
,我尝试了转义序列和未尝试转义序列;唯一成功的选择是使用unix风格的路径分离。另一个选择是通过扩展类加载来加载JAR:奇怪。。。您正在使用哪些操作系统和JRE?对我来说,它是Win7-64位和Java 6/7/8、32/64位。我用Visual Studio 2010编译我的EXE文件。@xav Win7 32/64位,带Java 6/7。使用gcc/g++mingwy编译的所有内容都必须在Windows上手动扩展“*”,并在类路径中使用“;”作为路径分隔符。实际上,我认为使用
/
并不是真正的解决方案。我现在和一个中情局有问题
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
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() );
        .....