国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

適合于Cygwin的JVM(java虛擬機)啟動器

2019-11-18 15:32:31
字體:
來源:轉載
供稿:網友

簡 介

     你碰到JNI和Cygwin的問題嗎?你用Windoes下的JVM不能加載Cygwin下創建的庫文件嗎?這篇文章將幫助你通過創建JVM啟動器來解決這個問題。我假設你對JNI有一個基本的理解。

關于Cygwin

    Cygwin是一個為Windows平臺開發的類linux環境。它包含兩部分:

    1.一個DLL(cygwin1.dll)。它作為Linux API仿真層提供了實質的Linux API功能。

    2.Linux風格的工具收集器。使用Cygwin,在Linux下的編譯的程序經常幾乎不用改變的被交叉變為為win32程序。它也能夠幫助在Windows下使用Linux的庫函數。

JNI和Cygwin

     你試過從java中加載Cygwin jni dll嗎?你可能會看到你的應用程序在System.loadLibrary().期間掛起了。原因是在Cygwin下Build的庫要依靠cygwin1.dll。假如沒有Cygwin使用的進程在運行,那么動態加載依靠于Cygwin(在加載時)的Dll將導致這個進程的死鎖。因此我們需要Cygwin進程來啟動JVM。這就簡單了........!我們用C語言創建一個啟動器然后在Cygwin下編譯連接。Cygwin的 Java Invocation API 工作并答應JVM被啟動。

怎樣創建(啟動)JVM

JDK或JRE中標準的啟動器命令(java 或 javaw.exe)就是一個用java虛擬機(JVM)連接的C程序。啟動器解釋命令行參數加載虛擬機,然后通過invocationg接口運行java應用程序。JVM將來就會成為一個叫做jvm.dll的動態連接庫。

在進一步深入之前,讓我們來討論幾個創建JVM會用到的結構體和函數

JavaVMInitArgs  

java虛擬機的參數,它被定義在jni.h中 如下:

typedef strUCt JavaVMInitArgs {
        /*JVM Version .It must be JNI_VERSION_1_2 or JNI_VERSION_1_4 or JVM will 
   interPRet pointer as a JDK1_1InitArgs*/ 
       jint version; 
       /*number of JVM options*/
        jint nOptions;
    JavaVMOption *options; 
    /*see definition of JavaVMOption below*/ 
       /*JVM option status.    if JNI_TRUE, ignore options VM does not understand
    otherwise return JNI_ERR if there are any unrecognized options*/
        jboolean ignoreUnrecognized;} JavaVMInitArgs;
/*Definition of JavaVMOption*/

typedef struct JavaVMOption {
    char *optionString; 
    /*a string containing the argument*/
        /*extra info to the JVM.Not important.*/ 
       void *extraInfo;} JavaVMOption;
JNI_CreateJavaVM

jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args);

第一個參數是指向javaVM指針的指針。javaVM結構體能被用來綁定和分離來往于虛擬機的本地線程,也用來銷毀這個虛擬機(從JDK1.4開始銷毀虛擬機的方式不被支持了,DestroyJavaVM將一直等待直到除了當前線程還有所有用戶線程都死亡之后才返回一個錯誤號)。第二個參數是一個指向JNIEnv指針的指針。JNIEnv結構體是JNI編程主要的做粗重工作的結構體。粗糙的講,JNIEnv結構體與一個具體的java線程相對應,JNIEnv結構體由JNI_CreateJavaVM()返回,因此它代表了虛擬機的主線程。第三個參數是一個無類型指針,它包含虛擬機的參數。下面是一個創建虛擬機實例的代碼:

     JavaVMInitArgs vm_args;
     JavaVMOption options[4];

     /* disable JIT */
 
     options[0].optionString ="-Djava.compiler=NONE";

     /* user classes */

     options[1].optionString = "-Djava.class.path=c://myclasses";

     /* native lib path */

     options[2].optionString = "-Djava.library.path=c://mylibs";

     options[3].optionString = "-verbose:jni";  /* print JNI msgs */
     vm_args.version = JNI_VERSION_1_2;
     vm_args.options = options;
     vm_args.nOptions = 4;
     vm_args.ignoreUnrecognized = TRUE;

     //Pointer to the function JNI_CreateJavaVM

     typedef jint (JNICALL CreateJavaVM_t)(JavaVM **pvm, void **env, void *args);

     //Load the jvm dll (the jvm !)

     HINSTANCE hinst = LoadLibrary("jvm.dll")

     //Get the address of the function

     CreateJavaVM_t *pfnCreateJavaVM = GetProcAddress(hinst, "JNI_CreateJavaVM");

     //Create JVM

     Int iRetval = pfnCreateJavaVM((&vm, (void **)&env,
                    &vm_args);

     //Error handling.

     if (res < 0) {
           ... /* error occurred
   }
  

進入討論組討論。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 津南区| 万全县| 庆元县| 象山县| 大连市| 渭南市| 泸定县| 渝北区| 宜丰县| 固原市| 邯郸市| 随州市| 华阴市| 万年县| 绩溪县| 尤溪县| 黑山县| 禄劝| 罗源县| 那曲县| 义乌市| 毕节市| 诏安县| 田阳县| 宿松县| 梅州市| 凤台县| 阳高县| 沁源县| 无为县| 福贡县| 西吉县| 阳朔县| 清水县| 前郭尔| 嘉鱼县| 比如县| 都江堰市| 临海市| 霍州市| 沭阳县|