C++ 调用jar包 找不到类

发布于 2021-11-21 07:29:50 字数 1180 浏览 815 评论 7

最近有个任务,需要用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无法返回值。  还望各位大神解惑,拜谢不已。。。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

梦中楼上月下 2021-11-26 13:11:38

问题可能还是处在java加载那里了,先把Jar改成class试试。你自己的类没有正确加载。

奈何桥上唱咆哮 2021-11-26 13:06:46

很多年没搞过 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;
	
}
猫烠⑼条掵仅有一顆心 2021-11-26 12:56:54

回复
你自己的jar包在哪

奢望 2021-11-26 11:59:16

回复
写完全路径,不要相对路径

夜无邪 2021-11-25 13:28:04

回复
试过写完全路径的,也没有效果。。。

浮生未歇 2021-11-25 05:58:42

回复
您好,在安装jdk的时候没有选有空格的目录,发现还是不行。。。

把昨日还给我 2021-11-21 11:05:17

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文