在C++代码中创建Java虚拟机。

本文探讨如何利用C++代码启动Java虚拟机,通过调整相关代码,可以实现类似Java2Exe的功能。JBuilder生成的exe文件将jar附加到exe末尾并以jar方式运行。解决Java GUI程序窗口闪过的关键是启动消息循环。
摘要由CSDN通过智能技术生成

好多人都在问如何将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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值