下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CSAE 410-2025温室气体 产品碳足迹量化方法与要求 电动乘用车
- T/UNP 161-2024Mini LED室内商用显示屏先进性评价
- T/GFOA 001-2023展览业数据采集规范
- T/CI 608-2024碳化硅衬底生产工艺技术规范
- T/CADBM 84-2024建筑冷热水输送用不锈钢波纹软管及管件安装验收规范
- T/CSA 083-2024室内调光照明产品节律光谱技术评价规范
- 2025~2026学年甘肃定西市陇西县度北师大版第一册一年级数学阶段学情自测卷【附答案】
- 上海市金山区2027届数学九年级第一学期期末学业质量监测试题含解析
- 2026学年陕西省延安市一年级语文期末自测盲点排查题(详细参考解析)详细答案和解析
- Photoshop四级职业技能考试模拟试卷(含详细答案解析)
- 2026湘钢校招笔试历年参考题库附带答案详解
- 抗菌药物在特殊人群(肝肾功能不全)中的应用
- 思想政治教育学原理知识点总结
- 民族英雄戚继光课件
- 常见体表肿物课件
- 警容风纪培训课件
- 冠心病的介入手术术后护理
- 2025内蒙古巴彦淖尔市能源(集团)有限公司招聘笔试历年参考题库附带答案详解
- (高清版)DG∕TJ 08-15-2020 绿地设计标准 附条文说明
- 建鱼池合同协议
- GB/T 2878.1-2025液压传动连接普通螺纹斜油口和螺柱端第1部分:斜油口
评论
0/150
提交评论