现有两个文件chatting.h和chatting.lib,但没有源码,要在java中调用chatting中定义的方法print()。由于java只能调用dll文件,不能调用lib文件,因此,现在必须先将chatting.lib转换成chatting.dll,再由java调用。但现在的问题是,将chatting.lib直接转换成chatting.dll是非常困难的(目前还像还没有这样的工具,欢迎大家拍砖)。所以,想到了一个傻但比较有效的方法,那就是:将文件chatting.h和chatting.lib用VC生成一个新的DLL文件(取名为dllChatting.dll),由于要调用chatting中的print()方法,那么在dllChatting中定义一个dllPrint方法(该方法与print()方法相比,除了函数名不一样,返回值和参数列表都是相同的),然后在dllPrint()中直接调用print(),dllPrint()将自己的的参数传递给print(),返回print()的返回值。
解决办法如下:
第一步:编写java调用dll的程序callDLL.java
第二步:生成被java调用的接口文件callDLL.h。执行以下命令:
>javac callDLL.java
>javah callDLL
生成的callDLL.h内容如下
第三步:利用接口文件callDLL.h在VC(VS2008)中实现该函数功能,并生成callDLL.dll
1. 创建dllChatting工程
1) 选择"Win32 控制台应用程序"
2) 应用程序类型选择"DLL"
2. 添加callDLL.h、chatting.h和chatting.lib到工程dllChatting中,并编辑dllChatting.cpp文件。
1)添加callDLL.h和chatting.h到工程:将这两个文件拷贝到dllChatting.vcproj的同级目录下,然后添加到头文件中。
2)添加chatting.lib到工程:1)将文件chatting.lib拷贝到文件dllChatting.vcproj的同级目录下;2)项目->dllChatting属性->配置属性->连接器->输入,在“附加依赖项”中添加“chatting.lib”。
3)编辑dllChatting.cpp如下:
3.添加模块文件dllChatting.def,修改其内容如下。
说明:在编译时,会提示找不到文件jni.h,可以将jni.h(在jdk的include 目录下)拷贝到工程目录下,然后将#include <jni.h>改为#include "jni.h"
第四步:用java调用callDLL.dll,检测是否成功。
将callDLL.dll拷贝到callDLL.java的同级目录下,执行以下命令:
>javac callDLL.java
>java callDLL
输出结果:
print in LIB: 1
print in DLL: 1
print in java: 1