C++ 调用jar包 找不到类

zoldean 发布于 2014/03/02 17:30
阅读 2K+
收藏 1

最近有个任务,需要用C++调用jar包里面的类,但是发现找不到类。  希望大神们可以帮忙分析一下。  以下是初始化JVM虚拟机的,在classpath上,把tools.jar,dt.jar,rt.jar 都包含进去了

options[0].optionString = "-Djava.compiler=NONE";   
options[1].optionString = "-Djava.class.path=./my.jar;D:\\Program Files\\Java\\jdk1.6.0_31\\lib\\tools.jar;D:\\Program Files\\Java\\jdk1.6.0_31\\lib\\dt.jar;D:\\Program Files\\Java\\jdk1.6.0_31\\jre\\lib\\rt.jar";  
options[2].optionString = "-verbose:jni";   //用于跟踪运行时的信息  
  
memset(&vm_args, 0, sizeof(vm_args));  
vm_args.version = JNI_VERSION_1_6;  
vm_args.nOptions = 1;  
vm_args.options = options;  
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

之后就是采用FindClass方法寻找类

test = env->FindClass("java/lang/String");  
item = env->FindClass("jm/item");

其中路径的设置是这样的my.jar在工程目录下,和main.cpp 是同一级  my.jar解压缩到当前目录 有文件夹jm 里面是item.class  test可以有正确的返回值,但是item不行

item无法返回值。  还望各位大神解惑,拜谢不已。。。。。。

加载中
0
红薯
红薯

C++ 调用 java 方法,还要牵扯很多 jvm 的 dll 库,你具体的报错信息是什么?

zoldean
zoldean
回复 @红薯 : 您好,在安装jdk的时候没有选有空格的目录,发现还是不行。。。
zoldean
zoldean
回复 @红薯 : 试过写完全路径的,也没有效果。。。
红薯
红薯
回复 @zoldean : 写完全路径,不要相对路径
zoldean
zoldean
该评论暂时无法显示,详情咨询 QQ 群:点此入群
红薯
红薯
回复 @zoldean : 你自己的jar包在哪
下一页
0
红薯
红薯
很多年没搞过 JNI 了,下面是我之前的一段代码,是可以正常运行的,其中 exe 和 jar 在同一个目录
int CJavaInterface::Init2()
{
	JavaVMInitArgs vm_args;
	JavaVMOption options[2];
	vm_args.version=JNI_VERSION_1_2;
	options[0].optionString = "-Djava.compiler=NONE"; 
	options[1].optionString = "-Djava.class.path=MeipTerm.jar"; 

	vm_args.version = JNI_VERSION_1_2;
	vm_args.nOptions = 2;
	vm_args.options = options;
	vm_args.ignoreUnrecognized = JNI_TRUE;
	return JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
}

int CJavaInterface::Init(long maxHeapSize,long javaStackSize)
{
	//return Init2();
	
	int i,nLength;
	jint err;
	char* classpath;
	char jarpath[MAX_PATH];
	JDK1_1InitArgs vm_args;
	if(env)
		return 0;
	classpath = (char*)calloc(1024,sizeof(char));
	vm_args.version=0x00010001;	
    JNI_GetDefaultJavaVMInitArgs(&vm_args);
	
	if(maxHeapSize>0)
		vm_args.maxHeapSize = maxHeapSize;
	if(javaStackSize>0)
		vm_args.javaStackSize = javaStackSize;
	
	//读取模块路径
	memset(jarpath,0,MAX_PATH);
	GetModuleFileName(0,jarpath,MAX_PATH);
	//将全路径字符串的文件名去除
	nLength = strlen(jarpath);
	for(i=nLength-1;i>=0;i--){
		if(jarpath[i]=='\\'){
			jarpath[i+1]=0;
			break;
		}
	}
	
	strcat(jarpath,CLASSPATH);
	sprintf(classpath,"%s;%s",vm_args.classpath,jarpath);
    vm_args.classpath = classpath;	
	
	err = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
	free(classpath);
	return err;
	
}
0
Monkey
Monkey
问题可能还是处在java加载那里了,先把Jar改成class试试。你自己的类没有正确加载。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部