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

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

          google搜索 __stdcall

          發現不同編譯器對__stdcall的實現是不同的,所以導致相同的聲明下,輸出函數名不一致.而java在win32平臺下默認是以微軟的vc6的編譯輸出格式為標準進行調用的.所以相同的頭文件vc6可以,而gcc不行,(bcb也不行)
          或許java有選項可以輸出兼容于其他編譯器的JNI頭文件吧.^_^.

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

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

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

          常用鏈接

          留言簿(1)

          隨筆檔案(6)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高尔夫| 上高县| 石屏县| 九江县| 营口市| 伊金霍洛旗| 和顺县| 罗田县| 紫阳县| 满城县| 太原市| 邳州市| 衡阳县| 民乐县| 启东市| 顺平县| 岫岩| 恩平市| 抚州市| 桐城市| 邢台市| 台南县| 潼南县| 新郑市| 阿拉善盟| 稷山县| 华宁县| 泰来县| 壤塘县| 霸州市| 子洲县| 繁峙县| 惠州市| 安康市| 土默特左旗| 昂仁县| 科尔| 葵青区| 河东区| 宣化县| 晋城|