关于使用JNA爬过的坑,JNA路径问题

我是抱着吐槽的态度来发这篇博客的,真坑!百度找了好久,好不容易才一点一点摸索实验出来,就是一个爬坑之旅。


一号坑:32位JDK

这个属于我小白了,具体报了
Native library (win32-x86/sdtapi.dll) not found之类的错误。
后来换了一个eclipse自带的32位报
Unsupported major.minor version 51.0,原来用了jdk1.6。没办法,重新下载换过来。你妹的JNA只能用32位,我16G内存多少年没用过32位JDK了。

二号坑:路径问题

(CLibrary) Native.loadLibrary(filePath, CLibrary.class);

这里面的filePath,很多文章里面是直接写文件名,然后把dll文件放到环境变量的目录里面,比如什么C:/windows/system32,还有jdk的bin目录。我只想说,你们烦不烦,做个项目还要到处放文件,误人子弟。就不能放到项目里面带着走?
于是我开始用CLibrary.class.getResource(“”).getPath(),于是几个超级大的坑来了!!!
1、我的文件夹目录中用过空格的,于是得到的地址会带着URI转义过的符号,坑了我很久,所以需要处理下!

CLibrary.class.getResource("").getPath().replaceAll("%20"," ");

2、dll文件绝对不能带下划线“_”,坑爹!!但是文件夹可以带。
3、CLibrary.class.getResource(“”).getPath()的最前面居然会带一条斜杠!?!,也就是得到的路径类似“/D:/project/test”,然后又是找不到路径。这个卡了我又一会。于是最后路径这样了:

String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"sdtapi.dll";

然后文件终于妥妥地放到了我的java文件旁边:
JNA dll文件路径
这样路径不就顺眼多了,比什么放到D盘目录,放到环境变量目录舒服多了。


好的,最后附上完整版demo代码:

package com.modules.ksdll.test;

import java.net.URL;

import com.sun.jna.*;

public class Test {
    public static void main(String[] args) {  
        try {
            //调用方法
            int result = CLibrary.sdtapi.InitComm(1001);
            System.out.println("result:"+result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

interface CLibrary extends Library {
    //绝对路径的地址获取,注意要去空格,特别坑
    String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"sdtapi.dll";
    CLibrary sdtapi = (CLibrary) Native.loadLibrary(filePath, CLibrary.class);
    //动态链接库中的方法
    int InitComm(int port);
    //动态链接库中的方法
    int Authenticate();
    //==============================================dll public method e
}

注意这里面的InitComm都是dll文件里面的方法,如果不知道dll内容的,下载一个DEPENDS.EXE进行查看。

感谢大家,最后,如果大家有什么问题,请发送邮件到shangaokun@qq.com大家一起探讨。

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
JDK 17 和 JNA(Java Native Access)一起使用时,你可以通过以下步骤进行设置和使用: 1. 首先,确保你已经安装了 JDK 17。你可以从官方网站(https://www.oracle.com/java/technologies/javase-jdk17-downloads.html)下载并安装适合你操作系统的版本。 2. 接下来,下载 JNA 的 JAR 文件。你可以从 JNA 的官方网站(https://github.com/java-native-access/jna)或者 Maven 中央仓库(https://mvnrepository.com/artifact/net.java.dev.jna/jna)获取最新的 JNA 版本。 3. 将下载的 JAR 文件添加到你的项目中。如果你使用的是 Maven 项目,可以将以下依赖项添加到你的 pom.xml 文件中: ```xml <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.10.0</version> </dependency> ``` 如果你不使用 Maven,请将下载的 JAR 文件手动添加到你的项目的类路径中。 4. 现在,你可以在代码中使用 JNA 进行本地方法调用。首先,创建一个接口来定义你想要调用的本地方法。例如,如果你想调用一个名为 `myLibrary` 的本地动态链接库中的方法,可以创建一个接口并定义这些方法,如下所示: ```java import com.sun.jna.Library; import com.sun.jna.Native; public interface MyLibrary extends Library { MyLibrary INSTANCE = Native.load("myLibrary", MyLibrary.class); void myMethod(); // 定义你想要调用的本地方法 } ``` 5. 接下来,在你的代码中使用该接口来调用本地方法。例如: ```java public class Main { public static void main(String[] args) { MyLibrary.INSTANCE.myMethod(); // 调用本地方法 } } ``` 确保你已经将 `myLibrary` 动态链接库放置到正确的位置,以便 JNA 可以找到并加载它。 这样,你就可以在 JDK 17 中使用 JNA 进行本地方法调用了。请记住,在使用 JNA 时,你需要小心处理本地库的加载和资源管理,以避免内存泄漏和其他问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值