下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/C++加载虚拟机的两种方法比较加载虚拟机可以采用以下两种方法:1、用创建子进程的方法调用java.exe来启动,在windows下面可以用CreateProcess方法,在Linux下面可以用execvp方法,调用的方式和用脚本调用差不多,这种方法比较简单我就不详细介绍了,详细的方式可以参考开源项目JavaServiceWrapper。用创建子进程的方式用以下优点:个人收集整理勿做商业用途1)开发简单,兼容性好,对于java虚拟机的不同版本调用方式都是一样的2)创建出来的java进程和C++程序的进程分离,不会相互影响,你不会因为C程序出现什么内存错误崩溃导致java进程也一起完蛋(当然分离进程也带来了其他问题,详见我后面的分析)。个人收集整理勿做商业用途有以下缺点:1)生成分离的java进程后,在系统里会看到另外一个java.exe的进程,当启动了很多这样的进程时,你会看到很多名称为java的进程,你无法区分哪个是哪个。个人收集整理勿做商业用途2)生成了分离的Java进程后,你就不好对它进行控制,比如说要关闭它,如果直接kill掉java进程,可能java进程里面一些关闭时需要做的清理工作还来不及做。如果想让java程序执行清理工作再退出,你就需要建立和java程序之间的通讯机制,以向java程序发出退出的消息,这通常还需要在java程序里面加载专门的类,以及需要java程序的开发人员进行相关的接口开发工作。个人收集整理勿做商业用途2、加载java虚拟机的另外一种方法是加载jvm的动态库,并通过动态库的接口来在本进程内启动java虚拟机。我更加喜欢这种方法,因为这种方法可以带来很多好处:个人收集整理勿做商业用途1)你可以更好地对java虚拟机进行有效地控制,java程序不需要加载专门的类库,你只需要调用不同的java类方法就可以控制java程序的启动、停止等操作个人收集整理勿做商业用途2)不会产生额外的java进程,在系统进程中进程名称是你C++主程序的名字,你可以在系统进程列表中很清楚地区分每个进程个人收集整理勿做商业用途当然这种方法也有缺点:1)由于java虚拟机在进程内部加载,如果主程序写得不好而崩溃会导致java程序也一起终止2)动态库接口得开发要稍微难一点,需要你了解jvm动态库的接口,不过待会儿你就会看到,这也不是很困难的事情个人收集整理勿做商业用途3)jdk不同版本的接口稍微有一点区别,以后可能也会发生变化,你可能得对不同的jdk版本修改一下C程序,但相对来说jvm的兼容性应该是可以信任的个人收集整理勿做商业用途加载jvm动态库的方法介绍下面就详细介绍一下用C++程序加载动态库的方法,将针对windows平台进行介绍:windows平台的加载方法windows平台下jdk的java虚拟机动态库为jvm.dll,位于:%JAVA_HOME%/jre/bin/client/jvm.dll%JAVA_HOME%/jre/bin/server/jvm.dllJvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,client版本加载速度较快,server版本加载速度较慢但运行起来较快。个人收集整理勿做商业用途虚拟机加载可按照以下步骤进行:1)装载jvm动态库2)查找JNI_CreateJavaVM接口3)设置JVM启动参数,调用JNI_CreateJavaVM接口启动虚拟机4)查找启动类,设置命令行参数,设置窗口输出重导向文件5)调用启动类的启动方法启动java程序6)要停止Java程序运行时,调用java类的停止方法即可下面的示例代码是一个简单的通过程序代码指定动态库的路径加载过程#include"jni.h"#include"stdio.h"#include<iostream>#include<windows.h>usingnamespacestd;typedefjint(JNICALL*JNICREATEPROC)(JavaVM**,void**,void*);个人收集整理勿做商业用途intmain(){ //jvm动态库的路径 constcharszJvmPath[]="D://ProgramFiles//Java/jdk1.6.0_30/jre/bin//server//jvm.dll";个人收集整理勿做商业用途 //java虚拟机的启动参数,每个参数写一项,不能合在一起写 JavaVMInitArgsvm_args; JavaVMOptionoptions[1]; //设置classpath options[0].optionString="-Djava.class.path=D://ProgramFiles//Java//jdk1.6.0_30//jre//bin;F://gcc//callJVM";个人收集整理勿做商业用途 vm_args.version=JNI_VERSION_1_6; vm_args.nOptions=1; vm_args.options=options;vm_args.ignoreUnrecognized=0; //加载JVM动态库,注意引入头文件windows.hHINSTANCEjvmDll=LoadLibrary(szJvmPath);if(jvmDll==NULL){printf("loadJVMdynamiclinklibraryerror:%l",::GetLastError());个人收集整理勿做商业用途returnfalse;} //查找JNI_CreateJavaVM过程。 //fpCJVCreateJavaVM=(fpCJV)::GetProcAddress(hVM,"JNI_CreateJavaVM");个人收集整理勿做商业用途JNICREATEPROCjvmCreateProc=(JNICREATEPROC)GetProcAddress(jvmDll,"JNI_CreateJavaVM");个人收集整理勿做商业用途if(jvmCreateProc==NULL){FreeLibrary(jvmDll);printf("findJNI_CreateJavaVMerror:%l",::GetLastError());个人收集整理勿做商业用途returnfalse;} //创建JVM。JNIEnv*env; JavaVM*jvm;jintr=(jvmCreateProc)(&jvm,(void**)&env,&vm_args);个人收集整理勿做商业用途if(r<0||jvm==NULL||env==NULL){FreeLibrary(jvmDll);printf("createJVMerror。");returnfalse;} cout<<"startloadclass"<<endl;//加载类 jclasshello=env->FindClass("Hello"); if(hello){ cout<<"findsuccess"<<endl; jmethodIDmain=env->GetStaticMethodID(hello,"main","([Ljava/lang/String;)V");个人收集整理勿做商业用途 //env->CallStaticVoidMethod(hello,main,NULL); env->CallStaticObjectMethod(hello,main,NULL);} return0;}启动jvm需要使用jni中的函数jintJNI_CreateJavaVM(JavaVM**p_vm,JNIEnv**p_env,void*vm_args);个人收集整理勿做商业用途第一个和第二个参数都是输入参数,放到函数中被初始化的。第三个参数应传递JavaVMInitArgs结构体的指针,JavaVMInitArgs的定义如下:个人收集整理勿做商业用途typedefstructJavaVMInitArgs{jintversion;jintnOptions;JavaVMOption*options;jbooleanignoreUnrecognized;}JavaVMInitArgs;1.version代表jni的版本,我这里填写的是JNI_VERSION_1_42.nOptions代表下边的JavaVMOption数组的个数options代表JavaVMOption数组类型,JavaVMOption的定义为:typedefstructJavaVMOption{char*optionString;/*theoptionasastringinthedefaultplatformencoding*/个人收集
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深孔注浆方案(改)
- DB37 1228-2009建筑物防雷装置施工与验收规范
- 软件销售服务合同书
- 项目劳务分包协议
- 软件维护流程优化合同
- 质押合同解除协议示例
- 学生全面发展承诺保证书
- 重庆市标准二手房买卖合同
- 房屋买卖合同规范化的必要性
- 房屋买卖合同与租赁合同的关系
- 人教版九年级道法全册易混易错知识点(二)
- 山西省建筑消防设施维护保养规程 DB14T2489-2022知识培训
- 2024年环保知识生态建设知识竞赛-人工环境工程学科奖学金(人环奖)知识竞赛考试近5年真题附答案
- 基础会计学试题库及其参考答案 (一)
- 01SS105给排水常用仪表及特种阀门安装图集
- 人教部编统编版初中八年级语文下学期全册单元测试卷(1-6单元全含期中期末及答案解析)
- 2024秋期国家开放大学《城市管理学》一平台在线形考(任务1至4)试题及答案
- GB/T 44592-2024红树林生态保护修复技术规程
- 2024年山东青岛局属高中自主招生化学试题(含答案)
- 朝阳区六年级上学期语文期末试卷
- 人教A版(2019)高中数学选择性必修第二册 《数列的相关概念》教学设计
评论
0/150
提交评论