使用JNA入门
使用JNA入门
公司连接硬件需要调用底层dll文件命令,特地了解下;正在学习。。
首先导入JNA jar包,笔者是maven项目直接写pom文件;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- https: //mvnrepository.com/artifact/net.java.dev.jna/jna --> <!-- <dependency>--> <!-- <groupId>net.java.dev.jna</groupId>--> <!-- <artifactId>jna</artifactId>--> <!-- <version> 5.3 . 1 </version>--> <!-- </dependency>--> <!-- https: //mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> <dependency> <groupId>net.java.dev.jna</groupId> <!-- jna-platform中已经集成了jna包 --> <artifactId>jna-platform</artifactId> <version> 5.3 . 1 </version> </dependency> |
这是最新的jar包,推荐使用4.x的jar;
定义接口继承Library 或者 StdCallLibrary ,定义静态常量 INSTANCE,使用 Native.loadLibrary() 读取 dll 文件,第一个参数是动态链接库 dll/so 的名称,但不带 .dll 或 .so 这样的后缀,这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了;第二个参数是本接口的Class类型。JNA通过这个 Class 类型,根据指定的 .dll/.so 文件,动态创建接口的实例,该实例由 JNA 通过 Java 的反射自动生成。
在 Windows 平台下 printf 函数所在的 dll 库名称是 msvcrt,而在其它平台如 Linux 下的 so 库名称是 c;
下面列出两个接口代码:
public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); void printf(String f);
static {
// dll文件路径,包括dll文件名称,不需要.dll后缀。如:E盘下的test.dll文件
Native.register("E:\\test");
}
}
或者是
1 public interface StdCallDll extends StdCallLibrary { 2 StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), StdCallDll.class); 3 4 void printf(String f); 5 }
用main方法调用这两个方法:
1 public static void main(String[] args) { 2 3 CLibrary.INSTANCE.printf("CLibrary:Hello,World!\n"); 4 5 StdCallDll.INSTANCE.printf("StdCallDll:Hello\n"); 6 }
可以看到控制台输出:
CLibrary:Hello,World!
StdCallDll:Hello
如果我们调用其他的dll文件,可以将第一个参数改为dll文件的路径;
还有就是要注意 Java 到 C 的类型的映射:
————————————————
版权声明:本文为CSDN博主「一天oO」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44721315/article/details/95361102
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)