使用gcc(win32)根據(jù)java導(dǎo)出的jini頭文件,編譯出的動態(tài)庫,無法被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)這兩個dll導(dǎo)出的函數(shù)名稱有所區(qū)別.
一個是 (gcc)
Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
另一個是(vc6)
_Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
相差了一個下劃線!!
難道是因?yàn)間cc編譯出的函數(shù)名稱與java預(yù)期的不一致,導(dǎo)致其在java中不能被正常的調(diào)用?于是,手動修改用于gcc編譯的jini頭文件中的函數(shù)聲明,在其原有名稱前加一個下劃線,使其與vc6的輸出的名稱一致,并相應(yīng)修改函數(shù)定義中的函數(shù)名稱.重現(xiàn)編譯之,并再次于java中調(diào)用,竟然通過了.
google搜索 __stdcall
發(fā)現(xiàn)不同編譯器對__stdcall的實(shí)現(xiàn)是不同的,所以導(dǎo)致相同的聲明下,輸出函數(shù)名不一致.而java在win32平臺下默認(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
___ 閱讀(3174)
評論(2) 編輯 收藏