频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

将Java应用程序转换为Windows服务

来源: 作者:IT168 gmplayer 出处:巧巧读书 2007-11-04 进入讨论组
下一页 1 2 3 

    如果你想将Java应用程序转换为Windows服务,有两种方法可以将Java应用程序转换为一个Windows服务: 

    1. Windows服务以单独的进程方式来执行Java应用程序 
    2. Windows服务在自己的进程上下文中创建一个Java virtual machine (JVM),然后以控制的方式关闭JVM。 

    本文中将采用第二种方法,为此需要能够理解Windows的一些概念和Java Native Interface (JNI)调用API。 

    模拟Java.exe 

    Windows任务管理器将会列出所有的Java应用程序进程,因此,没有什么办法可以区分单个的进程,为了指定特殊的Java应用程序的名字。可以通过使用JVM调用API来模拟Java运行时。 

    当你在命令提示符下运行java <your-class-name>,在系统路径中的java.exe加载几个DLL,以下几个DLL我们会感兴趣: 
    Java\jdk1.6.0_01\jre\bin\client\jvm.dll—Java JVM DLL 提供 JVM 调用 API. 一旦创建JVM, jvm.dll依次加载各种DLLs. 
    Java\jdk1.6.0_01\jre\bin\hpi.dll 
    Java\jdk1.6.0_01\jre\bin\verify.dll 
    Java\jdk1.6.0_01\jre\bin\java.dll 
    Java\jdk1.6.0_01\jre\bin\zip.dll 

    下面是java.exe如何出来DLL: 
    1. 加载JVMDLL 
    2. 创建JVM 
    3. 加载指定的类 
    4. 调用有签名的main方法:public static void main (String[] args) 

    使用在jni.h定义的JNI_CreateJavaVM方法,可以创建一个JVM实例,jni.h文件可以在<JDK-install-folder>\include目录下找到。 

    作为一个例子,采用基于Visual Studio 2005工程HelloKNR的一个简单Java程序:
package com.doorul; public class HelloKNR ...{ public static void main(String[] args) ...{ System.out.println("Hello KNR!"); } }
    为了简单起见,从最初的HelloKNR项目中移除了解析代码以追溯JVM选项和命令行参数。 

    下面是JNI代码来模拟java.exe,动态的加载jvm.dll而不是静态的绑定jvm.lib能使在选择JVM版本部署时更灵活。
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; vm_args.options = options; vm_args.nOptions = 1; vm_args.ignoreUnrecognized = JNI_FALSE; //load the JVM DLL HINSTANCE handle = LoadLibrary(RUNTIME_DLL); if( handle == 0) ...{ printf("Failed to load jvm dll %s\n", RUNTIME_DLL); return -1; } //get the function pointer to JNI_CreateJVM createJVM = (CreateJavaVM)GetProcAddress(handle, "JNI_CreateJavaVM"); res = createJVM(&vm, (void **)&env, &vm_args); if (res < 0) ...{ printf("Error creating JVM"); return -1; } //locate the class cls = env->FindClass(CLASS_NAME); if(cls == 0) ...{ printf("Exception in thread \"main\" java.lang.NoClassDefFoundError: %s\n", CLASS_NAME); return -1; } //get the method id of 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; } //invoke the main method with no parameters env->CallStaticVoidMethod(cls, mid, 0); //if there is any exception, print the exception if(env->ExceptionCheck()) ...{ env->ExceptionDescribe(); return -1; } return 0; }
    加载类com.doorul.HelloKNR时,可以使用“/”分隔符(例如com/doorul/HelloKNR),需要理解JNI签名形式来调用Java方法,例如,为调用void main(String[] args),签名格式为is ([Ljava/lang/String;)V: "["意思是数组;"L<classname>;"代表一个Java对象,V表示方法返回void。文字:http://www.qqread.com/java/2007/11/h379729.html 更多文章 更多内容请看Windows操作系统安装Windows权限设置Java环境安装配置专题,或进入讨论组讨论。
下一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章