<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-17  評論-6  文章-1  trackbacks-0
    HP-UX下使用JNI訪問標準C++程序

    問題的關鍵在于用aCC編譯時的參數
    根據HP網站上的兩篇文章可以很容易的使用JNI訪問傳統C++(Classical C++)程序
    http://www.hp.com/products1/unix/java/infolibrary/prog_guide/JNI_java2.html 
    http://forums1.itrc.hp.com/service/forums/questionanswer.do?admit=716493758+1092296929165+28353475&threadId=245738 
    但是,如果代碼中使用到了標準C++,也就是用到了STL,就會出現莫名其妙的JVM crash. 而且一般的現象是使用string的時候出錯

    最后發現是JVM的多線程機制和aCC編譯的缺省的多線程機制不一樣.所以編譯時需要加參數指定
    總的說來,編譯參數為
    OPTS=-AA +z +u4 -D_RWSTD_MULTI_THREAD -D_REENTRANT -D_HPUX -D_HPUX_SOURCE -D_POSIX_C_SOURCE=199506L -D_XOPEN_SOURCE_EXTENDED 

    其中,-D_RWSTD_MULTI_THREAD -D_REENTRANT 是指定多線程機制;同時必須添加-D_HPUX_SOURCE 參數,否則,編譯時會出現奇怪的錯誤
    連接參數為
    -AA -b -lCsup_v2 -lstd_v2 
    值得注意的是根據上面所說的第二篇文章可知使用-AA編譯連接時,要連的庫是libCsup_v2.sllibstd_v2.sl(這兩個庫是支持標準C++的庫),而不是第一篇文章中提到的libCsup.sllibstd.sl(這兩個庫是支持傳統C++的庫). 

    另外,有幾個碰到的問題
    1. 
    如果編譯參數沒有指定多線程機制,禁用JIT(啟動JVM加參數:-Djava.compiler=none -Xint )可以使簡單的例子通過,但是有些情況下還是會出錯

    2. 
    null作為String傳入JNI native接口代碼中是,使用env->GetStringUTFChars(jstring)會出現如下錯誤導致虛擬機崩潰
    Function=verify_instance_jfieldID__18jfieldIDWorkaroundSFP12klassOopDescP9_jfieldID 

    3. 
    在使用String作為JNI的傳入傳出參數,使用GetStringUTFChars解決不了中文問題,還是會有亂碼正確的解決方法是使用以下兩個函數
    void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) 

        jclass cls = env->FindClass(name); 
        /* if cls is NULL, an exception has already been thrown */ 
        if (cls != NULL) { 
            env->ThrowNew(cls, msg); 
        } 
        /* free the local ref */ 
        env->DeleteLocalRef(cls); 


    jstring JNU_NewStringNative(JNIEnv *env, const char *str) 

      if (str==NULL) 
      { 
       return NULL; 
      } 
      jclass jcls_str = env->FindClass("java/lang/String"); 
      jmethodID jmethod_str = env->GetMethodID(jcls_str, "", "([B)V"); 

      jstring result; 
      jbyteArray bytes = 0; 
      int len; 

      if (env->EnsureLocalCapacity(2) < 0) { 
        return NULL; /* out of memory error */ 
      } 
      len = strlen(str); 
      bytes = env->NewByteArray(len); 
      if (bytes != NULL) { 
        env->SetByteArrayRegion(bytes, 0, len,(jbyte *)str); 
        result = (jstring)env->NewObject(jcls_str, jmethod_str, bytes); 
        env->DeleteLocalRef(bytes); 
        return result; 
      } /* else fall through */ 
      return NULL; 



    char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) 

        jbyteArray bytes = 0; 
        jthrowable exc; 
        char *result = 0; 
        if (env->EnsureLocalCapacity(2) < 0) { 
            return 0; /* out of memory error */ 
        } 
    jclass jcls_str = env->FindClass("java/lang/String"); 
    jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes", "()[B"]; 

        bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes); 
        exc = env->ExceptionOccurred(); 
        if (!exc) { 
            jint len = env->GetArrayLength( bytes); 
            result = (char *)malloc(len + 1); 
            if (result == 0) { 
                JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 
                                0); 
                env->DeleteLocalRef(bytes); 
                return 0; 
            } 
            env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result); 
            result[len] = 0; /* NULL-terminate */ 
        } else { 
            env->DeleteLocalRef(exc); 
        } 
        env->DeleteLocalRef(bytes); 
        return (char*)result; 


    ★注意:使用char *JNU_GetStringNativeChars()獲得的指針用完后要顯式的free().

    posted on 2006-02-27 15:54 小鐵匠 閱讀(978) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 91亚洲国产成人久久精品网址| 久久精品国产亚洲AV麻豆王友容| 国产亚洲sss在线播放| 亚洲精品在线免费观看视频| 亚洲一区中文字幕久久| 免费av一区二区三区| 亚洲国产精品自在在线观看| 免费观看男人吊女人视频| 亚洲成A人片777777| 香蕉免费一区二区三区| 久久亚洲精品中文字幕| 中文字幕成人免费视频| 亚洲人成在线播放| 夜夜爽免费888视频| 黄色a级片免费看| 亚洲色婷婷六月亚洲婷婷6月| a级毛片免费全部播放| 亚洲久本草在线中文字幕| 久久午夜免费视频| 亚洲精品国产av成拍色拍| 无码国产亚洲日韩国精品视频一区二区三区 | 天堂亚洲免费视频| 国产一级淫片a免费播放口| 亚洲视频一区在线观看| 噼里啪啦电影在线观看免费高清 | 亚洲中文字幕在线乱码| 国内精品久久久久影院免费| 亚洲欧洲日韩在线电影| 日韩视频免费在线| a毛片免费在线观看| 亚洲另类小说图片| 又粗又大又硬又爽的免费视频| 三级黄色免费观看| 亚洲av无码国产综合专区| 亚洲成a人片在线播放| 日韩插啊免费视频在线观看| 亚洲熟妇AV日韩熟妇在线| 亚洲中文字幕无码不卡电影| 91大神免费观看| 九九久久精品国产免费看小说| 亚洲毛片在线观看|