您的位置:首页 > 职场人生

JNA使用问题及解决

2013-06-26 10:06 246 查看
因项目催得很急,尽管对JNA(Java调用Windows动态库)不熟悉,还是使用了JNA库。那么使用自己不了解的东西,总是很容易出现各种奇怪的问题。可反过来想想,哪有不存在技术难点的项目呢?是吧?当程序员就是个辛苦的行业,被项目逼着不停地去学习,去解决问题;但正因如此,程序员也是快乐的人,因为解决问题后,获得的成就感和喜悦感是很值得的。呵呵,不废话了,分享下我使用JNA遇到的问题及解决办法吧。

搜索路径

1. 项目的根路径;例:E:\workspace\test

2. 操作系统的全局路径;C:\WINDOWS 、C:\WINDOWS\system32

3. path指定的路径。

这是我遇到的一个问题:

An unexpected error has been detected by Java Runtime Environment: EXCEPTION_ACCESS_VIOLATION

我是将最新的动态库文件放到 JDK 目录下,提示的问题是:找不到最新的动态库文件。

首先需要排除的是,在哪些地方存在这个动态库文件,所以用Everything查找ComtradeData.dll文件,全部删除直至剩下一个位置存在这个文件;第二步尝试将最新的动态库文件放到 system32 目录。如果放到 system32 可以了,说明 JDK 目录的加载路径有问题,所以没有 Java 找不到这个文件。

后面想想,可能是因为 JAVA_HOME 环境变量,造成 JDK 目录没有加载到 path 目录的缘故吧。

工作流程

遇到的问题:

failed to create temporary file for jnidispatch: Java.IO.Exception: 系统找不到指定路径
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:751)


这个问题主要是对JNA的工作流程不了解而不知道怎么解决,那么Google就成了最好的帮手。通过搜索,知道JNA的工作流程是会需要创建临时文件的。如果临时文件创建不了,就提示这种错误了。

顺便,JNA的实际实现方法是如下实现的 (http://waffle.codeplex.com/discussions/243500):

JNA uses libffi, a magical native implementation that translates Java
underneath JNA extracts a native DLL into the temporary folder and then loads
When the process exits it kills that DLL.


大体意思是,JNA用到 libffi 库,通过这个库将 需要调用的 DLL 库加载到一个临时文件,当使用完毕后,再释放 libffi 库。

然后,知道需要临时文件,那么就查找 JNA 的临时文件再哪?有两种情况:一是临时文件夹不存在;二是Java对临时文件夹没有写的权限。

那JNA的临时文件夹路径在哪呢?网上给出了这几个位置:%TMPDIR%/jna, system library load path, %TEMP%, Tomcat's temp dir。

到这时,我发现了咱们的 tomcat 下没有 temp 这个文件夹,马上创建这个文件夹试试,呵呵,就解决了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java JNA 程序员
相关文章推荐