JNA使用问题及解决
因项目催得很急,尽管对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 这个文件夹,马上创建这个文件夹试试,呵呵,就解决了!
分类:
JavaScript / Web
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)