<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
    主站蜘蛛池模板: 亚洲精品线路一在线观看| 国产亚洲美女精品久久久2020| 亚洲男人第一av网站| 免费精品久久天干天干| 伊伊人成亚洲综合人网7777| 一级片在线免费看| 伊人久久精品亚洲午夜| 国产一二三四区乱码免费| 亚洲日韩小电影在线观看| a级精品九九九大片免费看| 亚洲AV一宅男色影视| 三年片在线观看免费观看大全动漫 | 成人片黄网站A毛片免费| 欧洲 亚洲 国产图片综合| 啦啦啦www免费视频| 在线观看亚洲网站| 亚洲国产成人精品女人久久久| 免费一级做a爰片久久毛片潮| 亚洲中文字幕无码专区| 叮咚影视在线观看免费完整版| 亚洲第一成年男人的天堂| 亚洲精品免费在线视频| 亚洲欧美日韩综合久久久久| 国产小视频免费观看| 久久嫩草影院免费看夜色| 久久亚洲精品中文字幕| 嫩草视频在线免费观看| 国产成人无码精品久久久免费| 91在线亚洲精品专区| 免费看片免费播放| 国产精品小视频免费无限app| 一区二区三区亚洲| 四虎成人精品在永久免费| 人妻在线日韩免费视频| 亚洲午夜国产精品| www.91亚洲| 99久9在线|免费| 免费无毒a网站在线观看| 91亚洲国产在人线播放午夜| 在人线av无码免费高潮喷水| 五月天婷婷精品免费视频|