sherrylso

C++博客 首页 新随笔 联系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks
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错误 。




posted on 2009-08-07 22:44 爱上龙卷风 阅读(2581) 评论(1)  编辑 收藏 引用

Feedback

# re: JNI调用之关于DLL库函数的导出[未登录] 2009-08-08 09:08 Alex
函数名称的改变是因为使用c++编译器造成的。使用C编译器就不会有这个问题。当使用C++编译器时,请使用extern "C" ,这样就没有问题了。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理