亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

打造個性化Java啟動器

2019-11-18 13:27:03
字體:
來源:轉載
供稿:網友

  主要內容:
  
  ________________________
  
   一、java程序的啟動過程
  
   二、Windows平臺的啟動器
  
   三、配置和使用
  
  ________________________
  
  對于普通用戶來說,Java最讓人不習慣的是程序的啟動過程;即使對于富有經驗的開發者,為了用默認的裝載器啟動Java程序,不得不編寫大量批命令、腳本文件,不得不在命令行環境下進行大量的復制/粘貼操作,也很輕易出現誤操作。
  
  用慣了Windows方便快捷的GUI,人們早就習慣了通過雙擊運行程序的方式。對于Java程序,要實現這個本機啟動功能就必須編寫定制的啟動器。用定制啟動器啟動Java程序不僅方便了最終用戶,而且使軟件作品看起來更專業。本文就以Windows平臺為例,介紹如何構造Java定制啟動器。
  打造個性化Java啟動器
  Java程序可以由任何本機運行的程序調用執行。所謂Java啟動器,就是一個專門用來啟動Java程序的本機執行程序。最常見的啟動器是Sun在Java Runtime Environment的/bin目錄中提供的啟動器,就Windows平臺而言,它們是java.exe和javaw.exe。前者運行時打開兩個窗口:一個是接收System.out/err和啟動器輸出的控制臺窗口,另一個是Java程序本身的窗口;javaw運行時不打開控制臺窗口。在J2SE/EE平臺中,虛擬機以動態庫的形式實現,也放在/bin目錄下。動態庫的名字在Windows中是java.dll,在Unix中是java.so。所謂“裝入虛擬機”,就是指裝入這個動態庫。
  
  提供給VM的參數可以通過兩種方式指定,或者是在啟動器的命令行參數中指定,或者通過定義相應的環境變量指定。只有一個參數例外——要啟動的類的名稱只能在啟動器的命令行參數中指定。雖然指定方式的多樣姓為人們各取所需帶來了方便,但不可否認地,它也正是許多混亂的根源。使用定制啟動器能夠完全避免這方面的問題。
  
  當VM結束啟動類的main()方法的運行,啟動器調用destroy()方法釋放各種資源并退出。應當注重的是,VM一旦開始運行,我們就不能再卸載它。對于Java啟動器來說,能否關閉VM無關緊要,因為啟動器會隨著Java程序的退出而退出;然而,對于嵌入了VM的本機應用,例如瀏覽器,這意味著有一塊內存被永久姓地占用,不能再收回。
  
  二、Windows平臺的啟動器
  
  搞清楚了Java程序的啟動過程,我們就可以開始編寫啟動器的代碼。下面這個啟動器用C++寫成,適合于所有Windows平臺。
  
  
  
  // Windows平臺下的Java程序啟動器
  
  // 適用于1.2或更高版本的VM
  
  #include
  
  #include
  
  #include
  
  using namespace std;
  
  void vShowError(string sErrorMessage);
  
  void vShowLastError(string sErrorMessage);
  
  void vDestroyVM(JNIEnv *env, JavaVM *jvm);
  
  void vAddOption(string& sName);
  
  JavaVMOption* vm_options;
  
  int mctOptions = 0;
  
  int mctOptionCapacity = 0;
  
  boolean GetapplicationHome(char *buf, jint sz);
  
  typedef jint (CALLBACK *CreateJavaVM)(JavaVM **pvm, JNIEnv **penv, void *args);
  
  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPRevInstance, PSTR szCmdLine, int iCmdShow){
  
  JNIEnv *env;
  
  JavaVM *jvm;
  
  jint jintVMStartupReturnValue;
  
  jclass jclassStartup;
  
  jmethodID midStartup;
  
  // 確定各種文件所在的路徑
  
  // -應用的主目錄
  
  char home[2000];
  
  if (!GetApplicationHome(home, sizeof(home))) {
  
  vShowError("不能確定應用的主目錄。");
  
  return 0;
  
  }
  
  string sAppHome(home);
  
  string sOption_AppHome = "-Dapplication.home=" + sAppHome;
  
  string sJREPath = sAppHome + "/jre";
  
  // -VM路徑
  
  string sRuntimePath = sJREPath + "/bin/classic/";
  
  string sJVMpath = sRuntimePath + "jvm.dll";
  
  // -啟動路徑
  
  string sBootPath = sJREPath + "/lib";
  
  string sOption_BootPath = "-Dsun.boot.class.path=" + sBootPath;
  
  // -CLASSPATH
  
  string sClassPath = sAppHome + "/classes";
  
  string sOption_ClassPath = "-Djava.class.path=" + sClassPath;
  
  // 設置VM參數
  
  // vAddOption(string("-verbose"));
  
  vAddOption(sOption_ClassPath);
  
  vAddOption(sOption_AppHome);
  
  // VM初始化參數
  
  JavaVMInitArgs vm_args;
  
  vm_args.version = 0x00010002;
  
  vm_args.options = vm_options;
  
  vm_args.nOptions = mctOptions;
  
  vm_args.ignoreUnrecognized = JNI_TRUE;
  
  // 裝入JVM庫
  
  HINSTANCE hJVM = LoadLibrary(sJVMpath.c_str());
  
  if( hJVM == NULL ){
  
  vShowLastError("不能從下面的路徑裝入JVM:" + sJVMpath);
  
  return 0;
  
  }
  
  // 啟動1.2/3/4 VM
  
  CreateJavaVM lpfnCreateJavaVM = (CreateJavaVM) GetProcAddress(hJVM, "JNI_CreateJavaVM");
  
  jintVMStartupReturnValue = (*lpfnCreateJavaVM) (&jvm, &env, &vm_args);
  
  // 是否成功?
  
  if (jintVMStartupReturnValue
  
  FindClass(sStartupClass.c_str());
  
  if (jclassStartup == NULL) {
  
  string sErrorMessage ="找不到啟動類[" +sStartupClass + "]";
  
  vShowError(sErrorMessage);
  
  vDestroyVM(env, jvm);
  
  return 0;
  
  }
  
  // 要啟動的方法
  
  string sStartupMethod_Identifier = "main";
  
  string sStartupMethod_TypeDescriptor ="([Ljava/lang/String;)V";
  
  midStartup = env->GetStaticMethodID(jclassStartup,
  
  sStartupMethod_Identifier.c_str(),
  
  sStartupMethod_TypeDescriptor.c_str());
  
  if (midStartup == NULL) {
  
  string sErrorMessage = "找不到啟動方法["+ sStartupClass + "."+ sStartupMethod_Identifier
  
  + "],類型描述符是[" + sStartupMethod_TypeDescriptor + "]";
  
  vShowError(sErrorMessage);
  
  vDestroyVM(env, jvm);
  
  return 0;
  
  }
  
  // 構造啟動方法的參數
  
  jstring jstringExampleArg;
  
  jclass jclassString;
  
  jobjectArray jobjectArray_args;
  
  jstringExampleArg = env->NewStringUTF("string1");
  
  if (jstringExampleArg == NULL){
  
  vDestroyVM(env, jvm);
  
  return 0;
  
  }
  
  jclassString = env->FindClass("java/lang/String");
  
  jobjectArray_args = env->NewObjectArray(1, jclassString, jstringExampleArg);
  
  if (jobjectArray_args == NULL){
  
  vDestroyVM(env, jvm);
  
  return 0;
  
  }
  
  // 調用啟動方法啟動Java程序
  
  env->CallStaticVoidMethod(jclassStartup, midStartup, jobjectArray_args);
  
  // 在退出之前嘗試分離主線程
  
  if (jvm->DetachCurrentThread() != 0) {
  
  vShowError("分離主線程失敗。/n");
  
  }
  
  // 只要還有非守護線程,下面的調用將一直被掛起
  
  jvm->DestroyJavaVM();
  
  return 0;
  
  }
  
  void vDestroyVM(JNIEnv *env, JavaVM *jvm){
  
  if (env->ExceptionOccurred()) {
  
  env->ExceptionDescribe();
  
  }
  
  jvm->DestroyJavaVM();
  
  }
  
  void vShowError(string sError) {
  
  MessageBox(NULL, sError.c_str(), "錯誤", MB_OK);
  
  }
  
  /* 在對話框中顯示錯誤信息,括號內包含
  
  的GetLastError錯誤信息 */
  
  void vShowLastError(string sLocalError) {
  
  LPVOID lpSystemMsgBuf;
  
  FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
  
  FORMAT_MESSAGE_FROM_SYSTEM FORMAT_MESSAGE_IGNORE_INSERTS,
  
  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  
  (LPTSTR) &

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线看| 91欧美精品成人综合在线观看| 久久99精品久久久久久琪琪| 亚洲国产精品va在线看黑人动漫| 最近2019中文免费高清视频观看www99| 国产成人精品999| 国产精品一二三在线| 色狠狠久久aa北条麻妃| www亚洲精品| 日本免费久久高清视频| 亚洲黄色在线观看| 在线播放日韩专区| 一区二区三区视频免费在线观看| 久久精品小视频| 国产精品一区二区三区毛片淫片| 26uuu亚洲国产精品| 国产精品嫩草视频| 国产mv免费观看入口亚洲| 日韩精品小视频| 成人黄色大片在线免费观看| 亚洲人成在线一二| 久久91亚洲精品中文字幕奶水| 亚洲精品在线视频| 中文字幕一区二区三区电影| 亚洲精品视频中文字幕| 精品国产乱码久久久久久婷婷| 另类少妇人与禽zozz0性伦| 国产精品成人aaaaa网站| 在线观看亚洲区| 懂色av中文一区二区三区天美| 国产一区二区三区在线观看网站| 日韩视频第一页| 欧美体内谢she精2性欧美| 中文字幕欧美在线| 亚洲国产精品大全| 国产午夜精品全部视频在线播放| 国产精品视频久| 国产精品免费久久久| 国产精品户外野外| 国产福利精品av综合导导航| 欧美日韩一区二区精品| 亚洲精品不卡在线| 激情久久av一区av二区av三区| 国产亚洲精品va在线观看| 国产在线视频欧美| 91久久国产精品| 欧美电影在线观看高清| 5566日本婷婷色中文字幕97| 午夜免费日韩视频| 亚洲精品久久在线| 久久91亚洲精品中文字幕| 26uuu日韩精品一区二区| 亚洲精品色婷婷福利天堂| 欧美日韩国产一区二区| 久久精品国产亚洲精品2020| 欧美成年人视频| 久久久91精品国产一区不卡| 亚洲欧美中文日韩在线v日本| 91精品视频网站| 亚洲国产小视频在线观看| 美日韩丰满少妇在线观看| www.久久色.com| 国产精品久久久久久久久免费| 亚洲国产日韩欧美在线图片| 国产成人综合亚洲| 精品国产91乱高清在线观看| 高清视频欧美一级| 欧美中文字幕在线| 俺去了亚洲欧美日韩| 精品国产欧美成人夜夜嗨| 成人做爰www免费看视频网站| 国产在线视频2019最新视频| 欧美日韩aaaa| 亚洲free嫩bbb| 国产精品久久久久久久久| 久久精品一本久久99精品| 欧美成人免费一级人片100| 日韩av免费在线播放| 26uuu另类亚洲欧美日本一| 国产亚洲一区二区在线| 韩国精品美女www爽爽爽视频| 亚洲精品国产欧美| 国内精品中文字幕| 国产精品中文久久久久久久| 欧美激情精品久久久久久免费印度| 久久全国免费视频| 久久久久日韩精品久久久男男| 亚洲欧美国产va在线影院| 久久久天堂国产精品女人| 欧美日韩国产麻豆| 68精品久久久久久欧美| 91免费综合在线| 欧美精品福利视频| 精品视频在线导航| 亚洲成人在线网| 国产亚洲精品久久久久久牛牛| 欧美成人免费大片| 91视频免费网站| 欧美激情亚洲另类| 91国产精品电影| 在线性视频日韩欧美| 国产精品亚洲欧美导航| 亚洲一区av在线播放| 国产99久久精品一区二区永久免费| 欧美美女18p| 国产亚洲成精品久久| 亚洲欧洲在线观看| 日韩av一区二区在线| 97在线免费观看视频| 亚洲国产精品网站| 热久久99这里有精品| 26uuu另类亚洲欧美日本一| 57pao国产精品一区| 国产不卡av在线| 国产精品白丝jk喷水视频一区| 成人激情视频小说免费下载| 国产欧美日韩中文字幕| 亚洲电影在线观看| 少妇av一区二区三区| 欧美噜噜久久久xxx| 日本久久亚洲电影| 国产视频精品在线| 久久韩国免费视频| 国产成人福利视频| 一本色道久久88综合日韩精品| 最新91在线视频| 亚洲精品www| 亚洲一区二区三区四区视频| 久久中文字幕视频| 国产精品精品一区二区三区午夜版| 97香蕉久久夜色精品国产| 亚洲精品久久久久久久久久久久久| 中日韩美女免费视频网址在线观看| 欧美激情a∨在线视频播放| 97香蕉久久超级碰碰高清版| 精品高清一区二区三区| 国产精品视频内| 成人情趣片在线观看免费| 国产精品草莓在线免费观看| 57pao国产精品一区| 不卡毛片在线看| 久久久精品免费视频| 久久手机精品视频| 韩国美女主播一区| 欧美激情欧美激情| 午夜精品久久久久久久男人的天堂| 2018日韩中文字幕| 国产精品爽爽爽爽爽爽在线观看| 精品国产福利在线| 热99精品里视频精品| 91久久精品日日躁夜夜躁国产| 中文字幕日韩欧美| 午夜免费日韩视频| 国产成人涩涩涩视频在线观看| 国产69精品99久久久久久宅男| 国产精品自产拍在线观看| 欧美激情国内偷拍| 欧美成人精品影院| 色综合久久久888| 日韩精品在线观看一区| 久久久国产成人精品| 欧美超级免费视 在线| 亚洲偷熟乱区亚洲香蕉av| 麻豆国产精品va在线观看不卡|