Загрузка нескольких JAR-файлов в Windows — JNI JNI_CreateJavaVM

Я создаю 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

Я предполагаю, что есть другой вариант, о котором я не думаю, но это сводит меня с ума.

2

Решение

Вы должны использовать -cp установить путь к классу. Я подозреваю -Djava.class.path= не будет делать то, что вы думаете, что должно.

2

Другие решения

Решение состоит в том, чтобы не использовать разделители файлов 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() );
.....
2

По вопросам рекламы [email protected]