C语言调用Java.doc_第1页
C语言调用Java.doc_第2页
C语言调用Java.doc_第3页
C语言调用Java.doc_第4页
C语言调用Java.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人可以得到解决。在C/C+中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。下面写一个小程序测试一下:Java代码:view plaincopy to clipboardprint?1. packagejni.test;2. 3. publicclassDemo4. 5. publicstaticintCOUNT=8;6. 7. publicStringmsg;8. privateintcounts;9. 10. publicDemo()11. this(缺省构造函数);12. 13. 14. publicDemo(Stringmsg)15. System.out.println(:+msg);16. this.msg=msg;17. this.counts=null;18. 19. 20. publicStringgetMessage()21. returnmsg;22. 23. 24. publicintgetCounts()25. returncounts;26. 27. 28. publicvoidsetCounts(intcounts)29. this.counts=counts;30. 31. 32. publicvoidthrowExcp()throwsIllegalAccessException33. thrownewIllegalAccessException(exceptionoccur.);34. 35. 上面的代码很好理解,我相信你能看的懂,我就不说了。下面是C语言代码,里面有注释,这里先不详细说明,主要先跑起来再说:view plaincopy to clipboardprint?1. #include 2. #include 3. #include 4. #include 5. intmain()6. /定义用到的变量 7. intres;8. JavaVM*jvm;9. JNIEnv*env;10. JavaVMInitArgsvm_args;11. JavaVMOptionoptions3;12. vm_args.version;13. 14. /设置初始化参数 15. options0.optionString=-Dpiler=NONE;16. /classpath有多个时,用;分隔,UNIX下以:分割。 17. options1.optionString=-Djava.class.path=.;18. /用于跟踪运行时的信息 19. options2.optionString=-verbose:jni;20. /版本号设置不能漏 21. vm_args.version=JNI_VERSION_1_6;22. vm_args.nOptions=3;23. vm_args.options=options;24. vm_args.ignoreUnrecognized=JNI_TRUE;25. /1.初始化虚拟机 26. res=JNI_CreateJavaVM(&jvm,(void*)&env,&vm_args);27. if(resFindClass(jni/test/Demo);34. /3.获取类的方法 35. jmethodIDmid=env-GetMethodID(cls,getMessage,()Ljava/lang/String;);36. /获取Java的构造方法 37. jmethodIDcon=env-GetMethodID(cls,(Ljava/lang/String;)V);38. jstringstrinit=env-NewStringUTF(Stilliscoding!);39. jvaluearg1;40. arg0.l=strinit;41. /env-AllocObject(cls); 42. /4.创建类的对象 43. jobjectobj=env-NewObjectA(cls,con,arg);44. /调用对象的方法 45. jstringmsg=(jstring)env-CallObjectMethod(obj,mid);46. 47. coutmsgGetStringUTFChars(msg,JNI_FALSE);49. printf(%s=,str);50. /5.退出虚拟机 51. jvm-DestroyJavaVM();52. fprintf(stdout,JavaVMdestory.n);53. return0;54. 把以上C语言代码用VC6.0打开,然后编译,下面问题就来了,我们一个一个解决。编译的时候首先会出现如下问题:错误很明显,我们上面包含了jni.h,但是没找到。这是需要设置一下VC。Tools-Options-Directories,添加JDK安装目录下的两个目录,如图:同时在Libraryfiles中添加JDK下面的LIB目录,如下图:点击OK完成,重新编译。好,新问题又来了,看下面描述:也很明显,说明没有找到jvm.lib。继续设置VC,Project-Settings-Link-Object/librarymodules中把上述路径替换为本机实际安装JDK中的jvm.lib目录,添加完后如下图:点击OK后重新编译,呵呵,又来问题了,我很高兴啊。这个问题在网上查了一下,原来是我JDK安装在ProgramFiles下的问题,因为ProgramFiles路径中有一个空格,真郁闷,没办法,只好重装JDK,注意安装目录中不能再有空格了。安装完了,按照上面出现的问题再重新设置一下VC,然后编译,没问题,运行,哇靠,又是一个问题:这个问题可是花了我大半天时间才搞定的,但其实做法很简单。看错描述,是没找到jvm.dll,网上很多人说直接找到这个文件把它拷贝到当前目录。但是这种方法不可取,因为jvm.dll这个东东还会依赖其他的文件的,而且它找其它所依赖的文件是通过相对路径找的,你直接就搞这么一个文件出来,其它的也找不到啊。所以这里有一个很好的解决方案,就是把D:Javajdk1.6.0_23jre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论