首先要说一下. dll可否调用与jdk位数有关,需要一致才行。也就是你的dll是64位的你的jdk就要是64位.32位的dll也要匹配32位的jdk.的否则会报错.运行不起来
首先下载 开源的JNA框架 链接已经提供好了 拿好不谢 链接:http://pan.baidu.com/s/1bpJrrJL 密码:ygod
1.JNA技术难点
有过跨语言、跨平台开发的程序员都知道,跨平台、语言调用的难点,就是不同语言之间数据类型不一致造成的问题。绝大部分跨平台调用的失败,都是这个问题造成的。关于这一点,不论何种语言,何种技术方案,都无法解决这个问题。JNA也不例外。
上面说到接口中使用的函数必须与链接库中的函数原型保持一致,这是JNA甚至所有跨平台调用的难点,因为C/C++的类型与Java的类型是不一样的,你必须转换类型让它们保持一致,比如printf函数在C中的原型为:
void printf(const char *format, [argument]);
你不可能在Java中也这么写,Java中是没有char *指针类型的,因此const char *转到Java下就是String类型了。
这就是类型映射(Type Mappings),JNA官方给出的默认类型映射表如下:
还有很多其它的类型映射,需要的请到JNA官网查看。
另外,JNA还支持类型映射定制,比如有的Java中可能找不到对应的类型(在Windows API中可能会有很多类型,在Java中找不到其对应的类型),JNA中TypeMapper类和相关的接口就提供了这样的功能。
我还发现个小窍门.
dll文件能能否成功调用取决于jdk位数。而且有个情况是位数不对应的话报的错是
"Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'testx64': 找不到指定的模块。"
它为什么是直接无视位数不符合的dll?仔细一想,代码搜寻dll文件时是按名字来的,那放2个同名的test.dll一个是64位的一个是32位的,自然就能搜到与自己对应的,这不就可以方便的解决兼容问题,连代码都不用改了。
但是还有一个问题,一个文件夹内文件时不能重名的,怎么放同名不同位的文件?原来jna调用dll不单会搜索项目下的dll,也会搜索在系统环境Path里各个文件,在里面填自己建两个文件分别放同名不同位的文件就行了
总结一下.
其实java调用dll库用jna还是蛮简单的.要是说有难点就是你首先要先搭建起来调用dll库的这个过程.这个调用过程还是很磨人的.jdk.dll32位还是64位要互相匹配.jar包不能用太低版本的要不然也会报错不匹配.当然这个jar包问题完全怪我自己. 谁让我不找个等级高点的.其次就是要跟所调用的dll库里面的函数相互匹配的参数.注意字节数.再就没什么好注意的了.jna唯一的缺点就是只能用java调用其他语言的dll库.不能互相调用,这算是他的缺点.