background image

Eclipse java 文件打包成 exe 文件

详解 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 <windows.h>

#include <jni.h>

//#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

 

 iC

mdShow)
{
    

 

//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";