JAVA-Jna在64位系统下调用32位DLL

最近有个项目需要调用第三方的dll,之前没接触过,花了点时间进行调研。

基本上有jacob, jawin,jni,jna等几种方法,大致都试了一试,jna算是简单易用就它了(期间发现介绍比较详细的文章一篇 传送门)。

本人机器是32位的,应用jna的jar包,将要调用的test.dll,放到系统变量目录下(一般c:\windows\system32即可)。

写个这样的接口:

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface TestInterface extends Library {
	TestInterface INSTANCE = (TestInterface) Native.loadLibrary("test", TestInterface.class);

	public int test(byte[] arg1, byte[] arg2, int arg3);

}

之后的使用异常简单:

 TestInterface.INSTANCE.deTdata(databuffer, hid, databuffer.length);

一切ok,测试了下也没有问题。
直到拿去部署到64位server2008服务器上,dll一拷,war包一上,半天系统没正常运行,日志提示:
java.lang.UnsatisfiedLinkError: Unable to load library xxxx。

一想dll也拷贝过去了,没准是dll是32位的dll不支持64位系统。
拿PEiD,Depends等乱七八糟的破解工具一看VC6.0写的Win32 GUI DLL啊,还引用了KERNEL32.DLL,难不成我反汇编下这个dll把里面的代码还原出来啊,不要说汇编不会,C++ 也忘光了,没辙了。

服务器上闲逛着,无意间发现任务管理器上有几个32位的程序xxxx*32.exe,我想你32位exe能跑我32位dll怎么不能跑。
网上下了32位的jdk装了,把dll放到了sysWoW64目录下,觉得不保险regsvr32 test.dll注册了下,提示错误不理会, 之后修改tomcat的文件catalina.bat,services.bat中的JAVA_HOME切换到这个JAVA_HOME2(指向32位jdk),运行startup.bat。

启动后任务管理器中进程变成了java*32.exe了,32位的dll调用一切正常。

这样做的坏处是我这个应用只能用1.5个G的内存了,多了不支持。

我这里不涉及另外乱七八糟的dll依赖,大家碰到类似情况,建议先用depends工具看看有没有别的dll依赖,环境缺啥补啥。