我正在处理一个项目,需要使用JNI从C++代码中调用一些Java函数。我尝试使用一个简单的Java类来实现这个功能,但是当我开始在我的Java项目中使用额外的.jar
文件时,JNI的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>";
java.library.path
是用于 本地 库(即.dll
或.so
文件) - jar 包(我想)应该添加到java.class.path
中。 - Drew McGowenoptions[1].optionString = "-Djava.calss.path=<path_to_my_jar_file>";
吗? - nabroyan