我正在尝试使用JNI从c ++(ms vc 2008)调用我的java类,但问题是FindClass仅在我的java类中没有导入包时才起作用。如果我添加任何包(例如java.lang.String或java.io.File),则FindClass失败并且不返回任何值。为什么呢?
C ++ CODE://///////////////////////////////////
JNIEnv *env;
JavaVM * jvm;
JavaVMInitArgs vm_args;
JavaVMOption options;
options.optionString = "-Djava.class.path=c:\\mypackage.jar";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(env == NULL)
printf("\nJVM Failed\n");
jclass cls = env->FindClass("mypackage/test/MyClass");
if(cls==0)
{
printf("\nFindClass Failed\n");
}
package mypackage.test;
import java.io.File; //if I comment this row, FindClass works...
public class MyClass {
}
更新:
这是我的代码:http://www.sendspace.com/file/233tfm
答案 0 :(得分:0)
我想这可能是因为你创建JVM时你的类路径只是c:\ mypackage.jar。我认为必须指定系统类路径。类路径可以设置为options.optionString =“ - Djava.class.path = c:\ mypackage.jar; C:\ jdk1.6.0_18 \ jre \ lib \ rt.jar”;请根据系统中rt.jar的位置进行更改....
答案 1 :(得分:0)
VM无法找到rt.jar和所有其他类。此question建议在设置其他选项之前运行JNI_GetDefaultJavaVMInitArgs(&vm_args);
。
答案 2 :(得分:0)
我发现了这个问题。如果我在Eclipse \ Jar Export \中选择“导出生成的类文件和资源”选项并且我在我的java类中添加了一些导入,则生成的JAR文件将不包含任何.class文件。相反,“导出已检查项目的所有输出文件夹”选项随时可用。我不知道为什么,但我会调查。