Я создаю JVM в своем приложении C ++ для Windows, и я не могу убедить его загрузить несколько 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
Я предполагаю, что есть другой вариант, о котором я не думаю, но это сводит меня с ума.
Вы должны использовать -cp
установить путь к классу. Я подозреваю -Djava.class.path=
не будет делать то, что вы думаете, что должно.
Решение состоит в том, чтобы не использовать разделители файлов Windows при передаче аргумента программе. \ Заканчивает тем, что экранирует последовательность с одним или несколькими \. Изменение аргумента на разделители файлов в стиле Unix корректно загружает все файлы в каталоге.
например:
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() );
.....