问题描述
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不是很熟悉。多谢!