DLL中導(dǎo)出函數(shù)有兩種方式,即:dllexport與.def文件。
dllexport方式是:在函數(shù)聲明中加上__declspec(dllexport);
.def方式是:采用模塊定義(.def)文件聲明,(.def)文件為鏈接器提供了有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。
(關(guān)于def文件,可以參考http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)
對于這兩種方式,需要特別說明的是:
第一、用.def文件導(dǎo)出的函數(shù),其名稱是按我們的意愿定義的,而用__declspec(dellexport)導(dǎo)出時,會有相應(yīng)的修飾名,具體的話,根據(jù)不同的編譯器其修飾名也不一樣。
dllexport方式是:在函數(shù)聲明中加上__declspec(dllexport);
.def方式是:采用模塊定義(.def)文件聲明,(.def)文件為鏈接器提供了有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。
(關(guān)于def文件,可以參考http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)
對于這兩種方式,需要特別說明的是:
第一、用.def文件導(dǎo)出的函數(shù),其名稱是按我們的意愿定義的,而用__declspec(dellexport)導(dǎo)出時,會有相應(yīng)的修飾名,具體的話,根據(jù)不同的編譯器其修飾名也不一樣。
第二、__declspec(dllexport)定義的導(dǎo)出多用于同一編譯器的隱式鏈接(靜態(tài)調(diào)用),而.def導(dǎo)出函數(shù)可以確定導(dǎo)出的函數(shù)名不會因為不同的編譯器而不同,可用于其它開發(fā)工具的調(diào)用。
有了上面的知識,我們再看JNI環(huán)境下的問題。
JNI定義了關(guān)鍵字JNIEXPORT,用于實現(xiàn)DLL中函數(shù)的導(dǎo)出的。實際在JNI中,JNIEXPORT被定義為,#define JNIEXPORT
__declspec(dllexport),也就是說JNI默認(rèn)的導(dǎo)出函數(shù)使用dllexport方式。我們知道,使用使用dllexport方式產(chǎn)生的導(dǎo)出函數(shù)名會根據(jù)編譯器發(fā)生變化,在這種情況下,當(dāng)Java程序通過Native接口調(diào)用DLL本地方法時,可能會發(fā)生找不到導(dǎo)出函數(shù)的問題。所以,在JNI的情況下,因此最好是定義一個.def文件來指明導(dǎo)出函數(shù),以避免發(fā)生UnSatisfiedLinkedException錯誤 。