Я работаю над проектом, в котором некоторые функции Java должны вызываться из кода C ++ с использованием JNI. Я пробовал это с простым классом Java, но когда я начинаю использовать дополнительные .jar
в моем проекте Java JNI’s FindClass
функция не может найти мой класс. Я провел некоторое исследование и прочитал о classpath
который необходим для компиляции файла .java, если он использует дополнительные библиотеки, но FindClass
возвращается null
в таком случае. Вот основная структура моего кода
JavaVMOption options[2];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean not;
options[0].optionString = "-Djava.class.path=<path_to_my_java_class>";
options[1].optionString = "-Djava.library.path=<path_to_my_jar_file>";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 2;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR)
{
cls = env->FindClass("package/ClassName"); //returns null while using jar
if(cls != 0)
{
//do some stuff
}
jvm->DestroyJavaVM();
return 0;
}
else
return -1;
Есть идеи?
ОБНОВЛЕНО:
Я также пытался
options[0].optionString = "-Djava.class.path=<path_to_my_java_class>;<path_to_jar>";
options[0].optionString = "-Djava.class.path=<path_to_my_java_class>";
options[1].optionString = "-classpath <path_to_jar>";
Я думаю, что ваша ошибка в том, что вы помещаете JAR в «library.path». Путь к библиотеке — это путь поиска нативных библиотек … а не файлов JAR.
Вы должны поместить файл JAR в путь к классам; например
options[0].optionString =
"-Djava.class.path=<path_to_my_java_class>:<path_to_my_jar_file>";
(В Windows используйте «;» в качестве разделителя пути к классу вместо «:».)
Я выяснил, что было 2 проблемы
1) path_to_my_jar_file
Этот путь должен указывать на файл JAR, а не на папку, в которой он находится.
2) -Djava.library.path
Комментарии Дрю Макгоуэна и ответа Стивена С. были правильными — путь к файлу jar должен быть таким, как они сказали.