DLL中导出函数有两种方式,即:dllexport与.def文件。
dllexport方式是:在函数声明中加上__declspec(dllexport);
.def方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
(关于def文件,可以参考http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)
对于这两种方式,需要特别说明的是:
第一、用.def文件导出的函数,其名称是按我们的意愿定义的,而用__declspec(dellexport)导出时,会有相应的修饰名,具体的话,根据不同的编译器其修饰名也不一样。
第二、__declspec(dllexport)定义的导出多用于同一编译器的隐式链接(静态调用),而.def导出函数可以确定导出的函数名不会因为不同的编译器而不同,可用于其它开发工具的调用。
有了上面的知识,我们再看JNI环境下的问题。
JNI定义了关键字JNIEXPORT,用于实现DLL中函数的导出的。实际在JNI中,JNIEXPORT被定义为,#define JNIEXPORT
__declspec(dllexport),也就是说JNI默认的导出函数使用dllexport方式。我们知道,使用使用dllexport方式产生的导出函数名会根据编译器发生变化,在这种情况下,当Java程序通过Native接口调用DLL本地方法时,可能会发生找不到导出函数的问题。所以,在JNI的情况下,因此最好是定义一个.def文件来指明导出函数,以避免发生UnSatisfiedLinkedException错误 。