仓酷云
标题:
JAVA编程:将Java代码打包为exe文件仓酷云
[打印本页]
作者:
不帅
时间:
2015-1-18 11:36
标题:
JAVA编程:将Java代码打包为exe文件仓酷云
net网页编程程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net网页编程比。java程序员都是代码完成的,所以java程序员常戏称.net网页编程程序员是操作员,呵呵。
1
基础信息
择要:
如今有良多的工具将Java代码打包为exe文件,实行时不必要再编写批处置文件,大概在命令行输出长长的classpath信息,为用户利用供应了很年夜的便利。这也是良多贸易软件经常利用的办法。
晏斐
2
将Java代码打包为exe文件
如今有良多的工具将Java代码打包为exe文件,实行时不必要再编写批处置文件,大概在命令行输出长长的classpath信息,为用户利用供应了很年夜的便利。这也是良多贸易软件经常利用的办法。将Java代码打包为exe文件,一样平常必要两个步骤:1.
编写当地代码,创立假造机,加载并实行MainClass。2.
将Java代码打包为jar文件,并与当地代码exe文件兼并。上面的代码,会加载jvm.dll,并挪用JNI_CreateJavaVM导出函数创立Java假造机,失掉JNIEnv指针,然后挪用FindClass查找MainClass,以后挪用GetStaticMethodID办法失掉main办法,并实行main办法。代码以下:#include<windows.h>
#include<jni.h>
//#pragmacomment(linker,"/subsystem:"console"/entry:"mainCRTStartup"")
#pragmacomment(linker,"/subsystem:"windows"/entry:"WinMainCRTStartup"")
typedefjint(JNICALL*JNICREATEPROC)(JavaVM**,void**,void*);
boolsetStream(JNIEnv*env,constchar*pszFileName,constchar*pszMethod);
//启动java假造机办法
//boolmain(intargc,char*argv[])
intWINAPIWinMain(HINSTANCEhInst,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)
...{
//jvm静态库的路径
constcharszJvmPath[]="d:jdk1.5.0_07jreinserverjvm.dll";
//java假造机的启动参数,每一个参数写一项,不克不及合在一同写
intnOptionCount=2;
JavaVMOptionoptions[2];
options[1].optionString="-Xmx256M";
//设置classpath
options[0].optionString="-Djava.class.path=./Test.exe";
JavaVMInitArgsvm_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
constcharszStartClass[]="com/primeton/test/TestClass";
//启动办法,一般是main函数,你也能够设定成其他函数
constcharszStartMethod[]="main";
//重导向文件
constcharszStdoutFileName[]="stdout.txt";
constcharszStderrFileName[]="stderr.txt";
//java程序的命令行参数
intnParamCount=2;
constchar*szParams[2]=...{"arg1","arg2"};
//加载JVM。
HINSTANCEjvmDll=LoadLibrary(szJvmPath);
if(jvmDll==NULL)
...{
printf("加载JVM静态库毛病。%l",::GetLastError());
returnfalse;
}
//查找JNI_CreateJavaVM历程。
JNICREATEPROCjvmCreateProc=(JNICREATEPROC)GetProcAddress(jvmDll,"JNI_CreateJavaVM");
if(jvmCreateProc==NULL)
...{
FreeLibrary(jvmDll);
printf("查找JNI_CreateJavaVM历程毛病。%l",::GetLastError());
returnfalse;
}
//创立JVM。
JNIEnv*env;
JavaVM*jvm;
jintr=(jvmCreateProc)(&jvm,(void**)&env,&vm_args);
if(r<0||jvm==NULL||env==NULL)
...{
FreeLibrary(jvmDll);
printf("创立JVM产生毛病。");
returnfalse;
}
//重导向stdout,stderr到输入文件
if(!setStream(env,szStdoutFileName,"setOut"))
...{
printf("设置stdout输入文件失利");
returnfalse;
}
if(!setStream(env,szStderrFileName,"setErr"))
...{
printf("设置stderr输入文件失利");
returnfalse;
}
//加载启动类。
jclassserviceClass=env->FindClass(szStartClass);
if(env->ExceptionCheck()==JNI_TRUE||serviceClass==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
FreeLibrary(jvmDll);
printf("加载启动类失利。");
returnfalse;
}
//启动办法
jmethodIDmid=env->GetStaticMethodID(serviceClass,szStartMethod,"([Ljava/lang/String;)V");
if(env->ExceptionCheck()==JNI_TRUE||mid==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
FreeLibrary(jvmDll);
printf("查找启动办法失利。");
returnfalse;
}
//查找String类。
jclassstringClass=env->FindClass("java/lang/String");
if(env->ExceptionCheck()==JNI_TRUE||stringClass==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
FreeLibrary(jvmDll);
printf("查找String类失利。");
returnfalse;
}
jstringjstr;
jobjectArrayargs=0;
args=env->NewObjectArray(2,stringClass,0);
for(inti=0;i<nParamCount;i++)
...{
jstr=env->NewStringUTF(szParams
);
if(jstr==0)...{
printf("分派String失利");
if(env->ExceptionOccurred())...{
env->ExceptionDescribe();
env->ExceptionClear();
}
returnfalse;
}
env->SetObjectArrayElement(args,i,jstr);
if(env->ExceptionCheck()==JNI_TRUE)
...{
printf("设置参数失利");
if(env->ExceptionOccurred())...{
env->ExceptionDescribe();
env->ExceptionClear();
}
returnfalse;
}
}
//挪用启动类的启动办法启动Java程序
//env->CallStaticVoidMethod(serviceClass,mid,parameterArray);
env->CallStaticVoidMethod(serviceClass,mid,args);
if(env->ExceptionCheck()==JNI_TRUE)
...{
env->ExceptionDescribe();
env->ExceptionClear();
FreeLibrary(jvmDll);
returnfalse;
}
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
...{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returntrue;
}
//设置输入流的办法
boolsetStream(JNIEnv*env,constchar*pszFileName,constchar*pszMethod)
...{
intpBufferSize=1024;
char*pBuffer=newchar[pBufferSize];
//创立字符串对象。
jstringpathString=env->NewStringUTF(pszFileName);
if(env->ExceptionCheck()==JNI_TRUE||pathString==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("创立字符串失利。");
returnfalse;
}
//查找FileOutputStream类。
jclassfileOutputStreamClass=env->FindClass("java/io/FileOutputStream");
if(env->ExceptionCheck()==JNI_TRUE||fileOutputStreamClass==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找FileOutputStream类失利。");
returnfalse;
}
//查找FileOutputStream类机关办法。
jmethodIDfileOutputStreamConstructor=env->GetMethodID(fileOutputStreamClass,"<init>","(Ljava/lang/String;)V");
if(env->ExceptionCheck()==JNI_TRUE||fileOutputStreamConstructor==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找FileOutputStream类机关办法失利。");
returnfalse;
}
//创立FileOutputStream类的对象。
jobjectfileOutputStream=env->NewObject(fileOutputStreamClass,fileOutputStreamConstructor,pathString);
if(env->ExceptionCheck()==JNI_TRUE||fileOutputStream==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("创立FileOutputStream类的对象失利。");
returnfalse;
}
//查找PrintStream类。
jclassprintStreamClass=env->FindClass("java/io/PrintStream");
if(env->ExceptionCheck()==JNI_TRUE||printStreamClass==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找PrintStream类失利。");
returnfalse;
}
//查找PrintStream类机关办法。
jmethodIDprintStreamConstructor=env->GetMethodID(printStreamClass,"<init>","(Ljava/io/OutputStream;)V");
if(env->ExceptionCheck()==JNI_TRUE||printStreamConstructor==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找PrintStream类机关办法失利。");
returnfalse;
}
//创立PrintStream类的对象。
jobjectprintStream=env->NewObject(printStreamClass,printStreamConstructor,fileOutputStream);
if(env->ExceptionCheck()==JNI_TRUE||printStream==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("创立PrintStream类的对象失利。");
returnfalse;
}
//查找System类。
jclasssystemClass=env->FindClass("java/lang/System");
if(env->ExceptionCheck()==JNI_TRUE||systemClass==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找System类失利。");
returnfalse;
}
//查找System类设置办法。
jmethodIDsetStreamMethod=env->GetStaticMethodID(systemClass,pszMethod,"(Ljava/io/PrintStream;)V");
if(env->ExceptionCheck()==JNI_TRUE||setStreamMethod==NULL)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("查找System类设置办法失利。");
returnfalse;
}
//设置System类的流。
env->CallStaticVoidMethod(systemClass,setStreamMethod,printStream);
if(env->ExceptionCheck()==JNI_TRUE)
...{
env->ExceptionDescribe();
env->ExceptionClear();
printf("设置System类的流失利。");
returnfalse;
}
returntrue;
}
第二步,将Java文件打包为exe文件,也很复杂。在Dos提醒符下实行copy命令:C:>copytest.exe+test.jartest.exe实在,就是将Java打包文件追加到exe文件尾部。翻开文件属性对话框,可看到有“紧缩文件”属性页。老牌的JBuilder.exe开辟工具编译天生的exe文件即接纳以下体例天生。跋文:人人在利用Eclipse3.2和Eclipse3.3时,在义务办理器中会看到两者的分歧。Eclipse3.2是先启动Eclipse.exe文件,然后由Eclipse.exe启动Javaw.exe文件来创立假造机。Eclipse3.2在义务办理器中显现为Eclipse.exe和javaw.exe两个历程。Eclipse3.3在义务办理器中显现为Eclipse.exe一个历程。从下面能够看出,Eclipse3.2和Eclipse3.3接纳了分歧的假造机加载体例。Eclipse3.2接纳创立子历程的办法挪用javaw.exe来启动,在windows上面能够用CreateProcess办法,此种办法较复杂,详细可拜见Eclipse源码。Eclipse3.3加载java假造机的别的一种办法是加载jvm的静态库,并经由过程静态库的接口来在本历程内启动java假造机。本文开首即接纳的第二种办法。来自:http://gocom.primeton.com/modules/newbb/item44444_44444.htm
手机用到的是用j2me所编出来的小程序。
作者:
山那边是海
时间:
2015-1-21 10:55
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者:
透明
时间:
2015-2-6 13:57
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者:
活着的死人
时间:
2015-2-10 07:16
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
简单生活
时间:
2015-2-26 06:49
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者:
老尸
时间:
2015-3-5 16:30
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
精灵巫婆
时间:
2015-3-11 03:27
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
海妖
时间:
2015-3-11 19:37
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者:
爱飞
时间:
2015-3-13 22:11
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者:
愤怒的大鸟
时间:
2015-3-15 22:03
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者:
飘灵儿
时间:
2015-3-22 05:10
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者:
金色的骷髅
时间:
2015-4-1 22:08
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者:
因胸联盟
时间:
2015-5-2 02:44
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
只想知道
时间:
2015-5-6 01:11
是一种使用者不需花费很多时间学习的语言
作者:
莫相离
时间:
2015-5-8 08:26
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
分手快乐
时间:
2015-6-12 04:49
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者:
admin
时间:
2015-6-17 03:47
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者:
深爱那片海
时间:
2015-6-22 07:15
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
谁可相欹
时间:
2015-7-7 22:09
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者:
若相依
时间:
2015-7-11 20:54
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2