C++利用JNI访问Java,提示找不到class

问题描述

c++利用jni访问java,代码结构如下:[zhang@tchelloworld]$pwd/usr/home/zhang/jni/helloworld[zhang@tchelloworld]$lshello.cppMakefileMyTest.javaMyTest.java.bakREADME[zhang@tchelloworld]$echo$CLASSPATH/usr/local/jdk/lib:/data1/hbase-0.96.2/hbase-client/src/main/java:/usr/home/zhang/javafun/classMyTest.java://packageMyTest;classMyTest{publicMyTest(){super();}publicstaticintadd(inta,intb){returna+b;}publicbooleanjudge(booleanbool){return!bool;}publicstaticvoidmain(String[]args){System.out.println("helloworld");}}hello.cpp:#include<stdio.h>#include<jni.h>#include<sys/time.h>#include<errno.h>#include<string.h>intmain(){JavaVMOptionoptions[1];JNIEnv*env;JavaVM*jvm;JavaVMInitArgsvm_args;longstatus;jclasscls;jmethodIDmid;jintsquare;structtimevalstart,stop;structtimevalt1,t2,t3,t4;floattime_use;options[0].optionString="-Djava.class.path=.";vm_args.version=JNI_VERSION_1_6;vm_args.nOptions=1;vm_args.options=options;vm_args.ignoreUnrecognized=JNI_TRUE;gettimeofday(&start,NULL);status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);if(status!=JNI_ERR){gettimeofday(&t1,NULL);//cls=env->FindClass("/usr/home/zhangbo6/javafun/class/MyTest");//cls=env->FindClass("java/lang/String");cls=env->FindClass("MyTest");gettimeofday(&t2,NULL);if(cls!=0){printf("findclassn");mid=env->GetStaticMethodID(cls,"add","(II)I");gettimeofday(&t3,NULL);if(mid!=0){square=env->CallStaticIntMethod(cls,mid,5,5);gettimeofday(&t4,NULL);printf("square:%dn",square);}}else{printf("cannotfindclassn");}jvm->DestroyJavaVM();}gettimeofday(&stop,NULL);printf("used%dus,createJVM%d,findclass%d,getMethod%d,callMethod%dn",(stop.tv_sec-start.tv_sec)*1000000+stop.tv_usec-start.tv_usec,(t1.tv_sec-start.tv_sec)*1000000+t1.tv_usec-start.tv_usec,(t2.tv_sec-t1.tv_sec)*1000000+t2.tv_usec-t1.tv_usec,(t3.tv_sec-t2.tv_sec)*1000000+t3.tv_usec-t2.tv_usec,(t4.tv_sec-t3.tv_sec)*1000000+t4.tv_usec-t3.tv_usec);return0;}Makefile:default:hellotclasstjarhello:hello.cppg++-ohellohello.cpp-I${JAVA_HOME}/include-I${JAVA_HOME}/include/linux-L${JRE_HOME}/lib/amd64/server-ljvmtclass:MyTest.javajavacMyTest.javatjar:tclassMyTest.classjar-cvfMyTest.jarMyTest.classclean:rm-rfhellohello.oMyTest.classMyTest.jar执行make&./hello:[zhang@tchelloworld]$makeg++-ohellohello.cpp-I/usr/local/jdk/include-I/usr/local/jdk/include/linux-L/usr/local/jdk/jre/lib/amd64/server-ljvmjavacMyTest.javajar-cvfMyTest.jarMyTest.classaddedmanifestadding:MyTest.class(in=567)(out=375)(deflated33%)[zhang@tchelloworld]$./hellofindclasssquare:10used91964us,createJVM82602,findclass7210,getMethod90,callMethod6但是我把MyTest.class和MyTest.jarmv到/usr/home/zhang/javafun/class/下,执行就无法找到MyTest.class:[zhang@tchelloworld]$mvMyTest.class/usr/home/zhang/javafun/class/[zhang@tchelloworld]$mvMyTest.jar/usr/home/zhang/javafun/class/[zhang@tchelloworld]$lshellohello.cppMakefileMyTest.javaMyTest.java.bakREADME[zhang@tchelloworld]$ls/usr/home/zhang/javafun/class/MyTest.classMyTest.jar[zhang@tchelloworld]$echo$CLASSPATH/usr/local/jdk/lib:/data1/hbase-0.96.2/hbase-client/src/main/java:/usr/home/zhang/javafun/class[zhang@tchelloworld]$./hellocannotfindclassused83917us,createJVM79262,findclass2671,getMethod-557925959,callMethod366006104还请熟悉的帮忙给点意见,搞了快一天了,烦球滴,ps:对java不是很熟悉。多谢!

解决方案

时间: 2024-09-16 03:06:43

C++利用JNI访问Java,提示找不到class的相关文章

JNI/NDK开发指南(六)——C/C++访问Java实例方法和静态方法

        转载请注明出处:http://blog.csdn.net/xyang81/article/details/42582213         通过前面5章的学习,我们知道了如何通过JNI函数来访问JVM中的基本数据类型.字符串和数组这些数据类型.下一步我们来学习本地代码如何与JVM中任意对象的属性和方法进行交互.比如本地代码调用Java层某个对象的方法或属性,也就是通常我们所说的来自C/C++层本地函数的callback(回调).这个知识点分2篇文章分别介绍,本篇先介绍方法回调,在

JNI的替代者:如何使用JNR访问Java外部函数接口(jnr-ffi)

1. JNR简单介绍 继上文"JNI的替代者-使用JNA访问Java外部函数接口",我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口.它管理着JVM和非托管的本地环境之间的边界,提供数据编组和对象生命周期管理协议. 根据JEP(JDK增强提案) 191,JNI在下列几个方面最令开发人员痛苦: 需要开发人员编写C代码,这意味着他们需要具备一个完全不同于Java的世界的专业知识. 由于开发人员必须对JVM如何管理内存和代码多少有一

rt jar-求java大神帮忙,java使用MAVEN编译时提示找不到类,但是类是属于rt.jar的

问题描述 求java大神帮忙,java使用MAVEN编译时提示找不到类,但是类是属于rt.jar的 java 版本: 1.6.0_10-rc2 maven 版本: 3.0.4 maven编译插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <s

使用ant工具生成java代码时build failed,总是提示找不到第二张图的东西

问题描述 使用ant工具生成java代码时build failed,总是提示找不到第二张图的东西

JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量

       转载请注明出处:http://blog.csdn.net/xyang81/article/details/42836783        在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过[类名.变量名]来访问.实例变量也称为成员变量(属性),每个实例都拥有一份实例变量数据的拷贝,它们之间修

搭建测试项目,提示找不到资源包,新人求指教,JDK+TOMCAT+MYSQL+JAVA WEB项目

问题描述 搭建测试项目,提示找不到资源包,新人求指教,JDK+TOMCAT+MYSQL+JAVA WEB项目 我是把 WEB项目的整个文件夹放到 TOMCAT的WEBAPPS下的 下图为问题的表现: 在点击登录时出现的 下图为登录界面 我在网络上查询,疑似是 资源映射位置错误,但我对着别人的解释逐个对比,没发现哪里错了.死活搭不成功,心塞得厉害 下面是我的资源图 项目文件位置图 登录页面位置图 SERVLET资源映射设置图 SERVLET资源实际位置图 SERVLET资源 的网址映射 还请各位前

java 爬虫搜索代码 下载后运行 提示找不到类

问题描述 java 爬虫搜索代码 下载后运行 提示找不到类 http://download.csdn.net/detail/xmt1139057136/7521113 从CSDN上下载这个工程后,运行java AppletClient ,提示找不到类,不知道为什么, 哪位高人给指点一下?再有就是,我要是想看这个工程的源代码,用什么编译器啊? 解决方案 反编译的话 我觉得jd-gui.exe这个不错 我很多源代码都是用这个软件反编译的 效果不错 运行java AppletClient ,提示找不到

java怎样可以做到利用JNI调用C++类,而不是C++方法?

问题描述 网上搜的介绍几本都通过JNI是java调用C/C++方法的,是否可以用java调用C/C++类呢?因为我底层接口是写的C++类,类中声明了好多变量,这些变量在类中好多方法中要被使用或赋值,相当于全局变量. 解决方案 解决方案二:基本上:无简易方法.如果你需要C++程序处理一个特定的复杂事物,可以考虑将C++写成纯命令行程序,然后Java用Runtime去执行,也就是进程方式.解决方案三:你觉得这样行不行,我在这个类之上再写个方法,在这个方法内调用类.但是这个方法我要多次调用,并且前一次

【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/art: No implementation found for void com.netease.xtc.cloudmusic.utils.NeteaseMusicUtils.nativeInit(android.content.Context) (tried Java_com_netease_xt