|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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所编出来的小程序。 |
|