简单的C++加载jvm实现

以前由于忙一直没有时间静下心来把学到的东西进行归纳整理,最近由于某些原因,总算可以总结一下了。


该小功能为大功能的前置部分,整个小功能需要用到windowService,主体逻辑主要使用java,故需要使用到C++加载jvm的技术,下面进入正题。


一,创建一个简单的java程序

package test;
public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello world");
	}
}
导出成Helloworld.jar


二,收集必要的一些资源文件

1,找到jvm,windows平台下jdk的java虚拟机动态库为jvm.dll,位于:
%JAVA_HOME%/jre/bin/client/jvm.dll
%JAVA_HOME%/jre/bin/server/jvm.dll

注:64x系统下没有client路径下的jvm。

2,获得jni.h和jni_md.h,位于

%JAVA_HOME%/include/jni.h

%JAVA_HOME%/include/win32/jni_md.h


三,创建一个简单的C++工程,将上面的文件都放入编译目录下

简单的C++加载jvm实现_第1张图片


工程的编码如下:

#include "stdafx.h"
#include "jni.h"

using namespace std;

bool startJVM();

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"haha"<FindClass(startClass);
	if(env -> ExceptionCheck() == JNI_TRUE || mainclass == NULL){
		env -> ExceptionDescribe();
		env -> ExceptionClear();
		FreeLibrary(jvmDLL);
		cout<<"加载启动类失败"<GetStaticMethodID(mainclass, startMethod, "([Ljava/lang/String;)V");
	if(env -> ExceptionCheck() == JNI_TRUE || methedID == NULL){
		env -> ExceptionDescribe();
		env -> ExceptionClear();
		FreeLibrary(jvmDLL);
		cout<<"加载启动方法失败"<CallStaticVoidMethod(mainclass, methedID, NULL);
	cout<<"执行结束"< DestroyJavaVM();
	return true;
}
编译的过程中需要注意的是,如果是64位的系统需要将工程的解决方案改成64x的,不然无法加载jvm,在
	HINSTANCE jvmDLL = LoadLibrary(jvmPath);
这一步取不到结果。


四,运行结果如下

简单的C++加载jvm实现_第2张图片

你可能感兴趣的:(C++)