- 浏览: 826810 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (530)
- Java编程 (64)
- C/C++/D (6)
- .Net/C# (9)
- Ruby (12)
- JavaScript (77)
- XML (1)
- JSON (1)
- Ajax (17)
- ExtJs (81)
- YUI (1)
- JQuery (7)
- DWR (1)
- HTML (7)
- CSS (7)
- Database (6)
- PowerDesigner (23)
- DB2 (2)
- Oracle (57)
- MS SQL Server (8)
- MySQL (6)
- JSP/Servlet/JSTL/TagLib (3)
- Spring (1)
- Hibernate (0)
- iText (0)
- Struts (0)
- Struts2 (0)
- iReport (0)
- FreeMarker (0)
- HttpClient (1)
- POI (6)
- FckEditor (15)
- Eclipse / MyEclipse (10)
- IntelliJ IDEA (0)
- NetBeans (0)
- Tomcat (11)
- WebLogic (1)
- Jboss (3)
- jetty (4)
- IIS (2)
- CVS/VSS (1)
- FTP (1)
- Windows/DOS (6)
- Linux/Unix (0)
- 软件建模 UML (0)
- Design Pattern & Thinking In Programming (10)
- 数据结构与算法 (12)
- 软件项目管理 (9)
- 行业应用解决方案 (3)
- 电脑软件与故障解决 (13)
- 编程语言 (1)
- 十万个为什么 (3)
- JBPM (2)
- sysbase (2)
- JDBC (8)
- Ant (2)
- Case-计算机辅助软件工程 (1)
- WebService (4)
- 浏览器 (1)
最新评论
-
gaoqiangjava:
同一楼,还请大手帮解决
JAVA读取word文件 -
hyl523:
// 判断数组中的第一个值是否未定义,如果未定义,便定义为空对 ...
javascript面向对象之二 命名空间 -
ping12132200:
ping12132200 写道我抱着个错不是因为:body标签 ...
extjs在IE报对象不支持此属性或方法 -
ping12132200:
我抱着个错不是因为:body标签内的第一个元素不能为文本tex ...
extjs在IE报对象不支持此属性或方法 -
fireinjava:
呀,不错,转走了,谢谢啦~
利用OpenOffice将word转换成PDF
一、概述
现在Java语言越来越受到程序员的关注。和Java相关的应用也越来越多。虽然Java是跨平台语言,但在国内有很多的应用都是运行在Windows下的。尤其是一些服务类程序。而一般基于Java的服务类程序都是以控制台方式运行的。这样虽然很直接。但如果服务程序多了,显得很乱。而且要使其在系统启动时运行也比较麻烦。因此,本文将介绍一种可以将Java程序转换为Windows服务的方法。通过这种方法。可以使Java程序象Windows服务程序一样运行。下面就让我们来进行转换吧。
一般有两种方法可以将Java程序转换为Windows服务:
1. 使用Windows服务直接在同一个进程运行Java应用程序。(这种方法服务程序无法更好地控制Java程序)。
2. 在Windows服务程序中建立一个java虚拟机实例(JVM),这个JVM实例和服务程序在同一个上下文中,而且JVM在Windows服务程序的控制之下。
第一种方法虽然实现起来简单,但这种方法不能很好地控制Java程序。因此,本文使用了第二种方法来运行Java程序。本文将带领读者一步一步地实现所有的内核代码。在实现代码之前,我们需要很好地了解Windows服务和Java本地接口(JNI)的概念和API的使用。
二、使用JVM API模拟Java运行时
由于Windows任务管理器将所有的Java进程都显示为"Java",因此,我们根本无法通过这种方式区分某一个Java进程。为了给每一个Java应用程序指定一个特殊的名子。我们需要使用JVM API来模拟Java运行时。
下面先来看看Java运行时(也就是java.exe)在运行时需要些什么。当我们使用java <类名>来运行java程序时,java.exe从系统路径动态装载了一些DLL库。这些Dll如下:
1. java\jdk\jre\bin\client\jvm.dll
这个dll提供了JVM所需要的API。一但我们建立了一个JVM,jvm.dll就会依次装载所需的Dll,这些Dll如下:
2. java\jdk\jre\bin\hpi.dll
3. java\jdk\jre\bin\verify.dll
4. java\jdk\jre\bin\java.dll
5. java\jdk\jre\bin\zip.dll
下面是java.exe如何处理Dll的过程:
1. 装载JVM Dll。
2. 建立一个JVM。
3. 装载指定的Java类。
4. 调用main方法,也就是public static void main (String[] args)。
我们可以使用在jni.h中定义的JNI_CreateJavaVM方法来建立一个JVM实例。我们可
以在JDK的安装目录中找到jni.h。
下面是一个简单的Java程序,在控制台中打印出"Hello World"。
下面是使用JNI来模拟java.exe的例子代码。在这里我们使用动态装载jvm.dll方法,而不是静态绑定jvm.lib。这样会更有弹性,如可以自由地选择java的版本。代码如下:
int InvokeMain() {
JavaVM *vm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jint res;
JNIEnv *env;
jclass cls;
jmethodID mid;
options[0].optionString = CLASS_PATH;
vm_args.version = JNI_VERSION_1_4; // 设置JDK的版本
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
//装载jvm.dll
HINSTANCE handle = LoadLibrary(RUNTIME_DLL);
if( handle == 0) {
printf("Failed to load jvm dll %s\n",
RUNTIME_DLL);
return -1;
}
// 得到JNI_CreateJVM指针
createJVM = (CreateJavaVM)GetProcAddress(handle,
"JNI_CreateJavaVM");
res = createJVM(&vm, (void **)&env, &vm_args);
if (res < 0) {
printf("Error creating JVM");
return -1;
}
// 装载指定的类
cls = env->FindClass(CLASS_NAME);
if(cls == 0) {
printf("Exception in thread \"main\"
java.lang.NoClassDefFoundError: %s\n",
CLASS_NAME);
return -1;
}
//得到main方法
mid = env->GetStaticMethodID(cls, "main",
"([Ljava/lang/String;)V");
if(mid == 0) {
printf("Exception in thread \"main\"
java.lang.NoSuchMethodError: main\n");
return -1;
}
// 调用main方法(不传递参数)
env->CallStaticVoidMethod(cls, mid, 0);
// 如果程序抛出异常,打印它
if(env->ExceptionCheck()) {
env->ExceptionDescribe();
return -1;
}
return 0;
}
在装载com.test.Hello时,我们必须使用"/"分割符(如com/test/Hello)。还有我们需要理解JNI调用Java方法的格式。如,为了调用void main(String[] args)方法,格式为:([Ljava/lang/String;)V:,"["表示数组;"L<classname>;"描述一个Java对象,V表示这个方法返回void。我们可以从JNI规范得到更多的细节。本文不再详细描述。
package com.test;
public class Hello{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/javaokay/archive/2008/03/12/2173669.aspx
发表评论
-
java调用dll方法
2011-06-02 21:56 1553Java语言本身具有跨平台性,如果通过Java调用DLL的技术 ... -
DIV+CSS
2011-05-31 13:07 874http://www.divcss5.com/ -
getWriter() has already been called for this response的解决办法
2011-05-30 14:15 3683Servlet规范说明,不能既调用 response.getO ... -
CVS客户端
2011-05-27 14:54 837http://www.syntevo.com/index.ht ... -
UML工具
2011-05-25 18:59 876http://www.umlchina.com/Tools/N ... -
applicationcontext.xml怎么分模块简化配置?
2011-05-22 18:02 2221(1) 在用spring做项止的时候,我们经常会在appli ... -
Struts1.2分模块后的路径问题
2011-05-22 18:00 15871.某项目分模块的web.xml配置如下: <i ... -
java API chm html 1.5 1.6 中文版英文版 帮助文档
2011-05-14 10:45 2649J2SE DK & API下载 ————————- h ... -
ClientAbortException原因探究
2010-12-23 16:17 1840WEB是部署在TOMCAT5.5.17下面的,采用JNDI链接 ... -
java游戏 http://blog.csdn.net/cping1982/archive/2009/06/10/4258704.aspx
2010-11-08 22:31 1206http://blog.csdn.net/cping1982/ ... -
Java中字符串(String)的存储和赋值原理
2010-11-08 22:14 1203可能很多java的初学者对String的存储和赋值有迷惑, ... -
Java中字符串的最大长度
2010-11-08 22:12 1285在cpp中为了可移植性,string的长度是string::s ... -
Java与XML联合编程之DOM篇
2010-10-06 13:37 861一、DOM初步 DOM是Document Object ... -
jexl解析表达式字符串
2010-10-06 11:44 1928网址:http://commons.apache.org/je ... -
Java中getResourceAsStream的用法
2010-10-06 11:31 1979Java中getResourceAsStream的用法 首先 ... -
Class.getResourceAsStream 和 ClassLoader.getResourceAsStream
2010-10-06 11:08 826Class.getResourceAsStream 和 Cla ... -
利用第三方的Jar包内的类和方法来判别文件编码
2010-08-06 13:07 1745今天在论坛里看见了一个人发帖子问,如何查看文件的编码。有一个人 ... -
将Java程序作成exe文件的几种方法
2010-08-06 13:04 945看到网上有同志的介绍将Java程序作成exe文件的方法,写的不 ... -
Java基本类型转换总结
2010-07-26 19:49 1359数值型转换成字符型 // 基本数据类型, int i_a ... -
怎样不使用中间变量来交换两个变量的值?
2010-07-10 21:39 1443int 的话就+后再减.string 的话就连接再截取. ...
相关推荐
使用JavaService把Java程序转换成windows服务
Java程序快速转换为windows服务运行
经常有需要将Java程序部署到Windows上面运行,以上软件可以转换为exe
NULL 博文链接:https://xbgd.iteye.com/blog/754948
可以将java程序转换成exe程序,设置图标、启动参数,或者将java程序配置成windows服务。类似eclipse
如何将写好的java程序轻松的脱离jre而移植到windows平台,这是个很好的软件,只要用java写好程序,就可以转换成.exe的windows平台的app
可以把java程序包装成exe可执行文件,windows64位版本
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由...
使用java代码将amr文件转换为MP3文件,本jar包只支持linux平台, windows平台需要单独下载ffmpeg.exe文件,地址:http://ffmpeg.org/download.html
exe4j帮助集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。exe4j帮助以一种安全的方式启动java应用程序,来显示本地启动画面,检测及...
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由...
将java生成的程序制作成windows桌面的.exe程序,非常方便,不用安装,安装步骤走下来,最后就会生成exe程序,双击可运行,希望对大家有帮助,谢谢!
Jacob是Java和Windows下的Com桥,通过它我们可以在Java程序中调用COM组件。如果你的JDK是1.4,那你需要下载Jacob1.9的jni库才能正常运行,早期版本在JDK1.4下有些问题。
documents4j是一个用于将文档转换为其他文档格式的java库。这是通过将转换委托给任何本机应用程序来实现的,这些应用程序能够理解将给定文件转换为所需目标格式的过程。documents4j附带了对ms-word和ms-excel for ...
配置环境变量JAVA_BIN和JAVA_INCLUDE。比如: JAVA_BIN:C:\Program Files\Java\jdk-12.0.2\bin JAVA_INCLUDE:C:\Program Files\Java\jdk-12.0.2\include 进入Examples\java\simple目录,用VS2019打开example.dsp。...
4. 生成的“Windows NT 服务”支持暂停/继续,并且有事件触发 Java 程序。 5. 生成的“Windows NT 服务”类型的可执行文件自带安装和卸载服务功能。 6. 能对 class 文件进行加密保护,使无法通过对 exe 解压得到 ...
连结程序使用该信息在.EXE文件中建立一个表格,在加载程序时,Windows使用它将呼叫转换为Windows函数。 WINDOWS程序设计选项 为说明Windows程序设计的多种技术,本书提供了许多范例程序。这些程序使用C语言撰写并...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Java2Cpp转换器 应用程序将Java源代码转换为C ++源代码。