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