好多人都在问如何将java代码打包成exe文件,其实,下面这段代码稍微修改一下就可以做一个类似Java2Exe的功能。
顺便看了一下JBuilder编译生成的exe文件(星期天半天的时间花在研究这个上面了),是将jar文件追加到exe文件末尾,然后将exe文件当作jar文件来使用,因此,调试了半天也没发现它写临时文件。方法还是挺巧妙的。其实,替换掉JBuilder生成的exe文件末尾的jar文件就可以生成你自己的打包exe文件。
下面代码是csdn blog 上fita的,原文在:http://blog.csdn.net/fita/archive/2005/03/23/327838.aspx ,不过有编译错误(估计是fita故意的),我只是调了调。
另一个问题是,如果是Java GUI程序,须在启动Java程序后,开始一个消息循环,否则Java程序窗口会一闪而过。
#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 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=./startup.jar;./DirectMail.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/qzsoft/directmail/MainFrame";
//启动方法,通常是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;
}
#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 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=./startup.jar;./DirectMail.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/qzsoft/directmail/MainFrame";
//启动方法,通常是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;
}