JNI FindClass因导入而失败

时间:2011-08-17 09:57:26

标签: java c++ visual-studio visual-c++ java-native-interface

我正在尝试使用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");
}
JAVA CODE://///////////////////////////////////

package mypackage.test;

import java.io.File;   //if I comment this row, FindClass works...

public class MyClass {

}

更新:

这是我的代码:http://www.sendspace.com/file/233tfm

  • 复制C:\ JNITest
  • 更改项目的属性\调试设置中的工作目录
  • 检查JNI_test1.cpp中的optionString
非常感谢, 的Riccardo

3 个答案:

答案 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文件。相反,“导出已检查项目的所有输出文件夹”选项随时可用。我不知道为什么,但我会调查。