设为首页 加入收藏

TOP

将Java代码打包为exe文件
2014-11-23 21:52:19 】 浏览:282
Tags:Java 代码 打包 exe 文件

  现在有很多的工具将Java代码打包为exe文件,执行时不需要再编写批处理文件,或者在命令行输入长长的classpath信息,为用户使用提供了很大的方便。这也是很多商业软件常常使用的方法。


  将Java代码打包为exe文件,一般需要两个步骤:


  1. 编写本地代码,创建虚拟机,加载并执行Main Class。


  2. 将Java代码打包为jar文件,并与本地代码exe文件合并。


  下面的代码,会加载jvm.dll,并调用JNI_CreateJavaVM导出函数创建Java虚拟机,得到JNIEnv指针,然后调用 FindClass查找Main Class,之后调用GetStaticMethodID方法得到main方法,并执行main方法。代码如下:


  #include


  #include


  //#pragma comment( linker, "/subsystem:"console" /entry:"mainCRTStartup"" )


  #pragma comment( linker, "/subsystem:"windows" /entry:"WinMainCRTStartup"" )


  typedef jint (JNICALL *JNICREATEPROC)(JavaVM **, void **, void *);


  bool setStream(JNIEnv *env, const char* pszFileName, const char* pszMethod);


  //启动java虚拟机方法


  //bool main(int argc,char *argv[])


  int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)


  ...{


  //jvm动态库的路径


  const char szJvmPath[] = "d:\jdk1.5.0_07\jre\bin\server\jvm.dll";


  //java 虚拟机的启动参数,每个参数写一项,不能合在一起写


  int nOptionCount = 2;


  JavaVMOption options[2];


  options[1].optionString = "-Xmx256M";


  //设置classpath


  options[0].optionString = "-Djava.class.path=./Test.exe";


  JavaVMInitArgs vm_args;


  vm_args.version = JNI_VERSION_1_4;


  vm_args.options = options;


  vm_args.nOptions = nOptionCount;


  vm_args.ignoreUnrecognized = JNI_TRUE;


  //启动类,注意分割符是/,例如启动类test.JTest应该写成 test/JTest


  const char szStartClass[] = "com/primeton/test/TestClass";


  //启动方法,通常是main函数,你也可以设定成其他函数


  const char szStartMethod[] = "main";


  //重导向文件


  const char szStdoutFileName[] = "stdout.txt";


  const char szStderrFileName[] = "stderr.txt";


  //java程序的命令行参数


  int nParamCount = 2;


  const char *szParams[2] = ...{"arg1","arg2"};


  //加载JVM。


  HINSTANCE jvmDll = LoadLibrary(szJvmPath);


  if (jvmDll == NULL)


  ...{


  printf("加载JVM动态库错误。%l", ::GetLastError());


  return false;


  }


  //查找JNI_CreateJavaVM过程。


  JNICREATEPROC jvmCreateProc = (JNICREATEPROC)GetProcAddress(jvmDll, "JNI_CreateJavaVM");


  if (jvmCreateProc == NULL)


  ...{


  FreeLibrary(jvmDll);


  printf("查找JNI_CreateJavaVM过程错误。%l", ::GetLastError());


  return false;


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇利用Java查询Jar包内的驱动类名 下一篇求Box体积和面积的java小程序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目