知新軒
          溫故而知新,可以為師矣.
          posts - 7,  comments - 2,  trackbacks - 0

          使用gcc(win32)根據(jù)java導(dǎo)出的jini頭文件,編譯出的動(dòng)態(tài)庫(kù),無(wú)法被java正常的調(diào)用.而相同的頭文件,使用vc6編譯出的dll則可以.函數(shù)聲明如下:
          JNIEXPORT jint JNICALL Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend
            (JNIEnv *, jobject, jstring, jint, jstring, jint, jint, jstring);
          其中:
          JNIEXPORT  在gcc和vc6的中都是定義為 __declspec(dllexport)
          JNICALL  在兩種編譯環(huán)境下也都是定義為 __stdcall
          觀察兩種環(huán)境下生成的dll,發(fā)現(xiàn)這兩個(gè)dll導(dǎo)出的函數(shù)名稱有所區(qū)別.
          一個(gè)是 (gcc)
          Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
          另一個(gè)是(vc6)
           _Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
          相差了一個(gè)下劃線!!
          難道是因?yàn)間cc編譯出的函數(shù)名稱與java預(yù)期的不一致,導(dǎo)致其在java中不能被正常的調(diào)用?于是,手動(dòng)修改用于gcc編譯的jini頭文件中的函數(shù)聲明,在其原有名稱前加一個(gè)下劃線,使其與vc6的輸出的名稱一致,并相應(yīng)修改函數(shù)定義中的函數(shù)名稱.重現(xiàn)編譯之,并再次于java中調(diào)用,竟然通過了.

          google搜索 __stdcall

          發(fā)現(xiàn)不同編譯器對(duì)__stdcall的實(shí)現(xiàn)是不同的,所以導(dǎo)致相同的聲明下,輸出函數(shù)名不一致.而java在win32平臺(tái)下默認(rèn)是以微軟的vc6的編譯輸出格式為標(biāo)準(zhǔn)進(jìn)行調(diào)用的.所以相同的頭文件vc6可以,而gcc不行,(bcb也不行)
          或許java有選項(xiàng)可以輸出兼容于其他編譯器的JNI頭文件吧.^_^.

          posted on 2005-12-23 10:47 ___ 閱讀(3175) 評(píng)論(2)  編輯  收藏

          FeedBack:
          # re: win32下使用gcc編譯供java 調(diào)用的dll須知(jini)
          2006-01-09 17:06 | 小鐵匠
          # re: win32下使用gcc編譯供java 調(diào)用的dll須知(jni)
          2007-05-31 21:12 | zb
          暈倒,那里的事呀....一點(diǎn)也不用改的..  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2005年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆檔案(6)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 新宁县| 克东县| 汉沽区| 建昌县| 韩城市| 剑川县| 丰原市| 额尔古纳市| 彩票| 嘉义县| 图片| 鄢陵县| 休宁县| 玛沁县| 柳州市| 阜宁县| 宜兰县| 宁国市| 温宿县| 晋江市| 祥云县| 磐安县| 汕头市| 辽中县| 林周县| 武威市| 普陀区| 肇东市| 阿坝县| 延安市| 墨竹工卡县| 乐清市| 临清市| 邵武市| 罗源县| 突泉县| 新绛县| 余庆县| 桐乡市| 温泉县| 南澳县|