JNA初级入门

使用JNA入门

公司连接硬件需要调用底层dll文件命令,特地了解下;正在学习。。
首先导入JNA jar包,笔者是maven项目直接写pom文件;

<!-- 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>
            <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);
    }

    public interface StdCallDll extends StdCallLibrary {
        StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), StdCallDll.class);

        void printf(String f);
    }

用main方法调用这两个方法:

public static void main(String[] args) {

        CLibrary.INSTANCE.printf("CLibrary:Hello,World!\n");

        StdCallDll.INSTANCE.printf("StdCallDll:Hello\n");
    }

可以看到控制台输出:

CLibrary:Hello,World!
StdCallDll:Hello

如果我们调用其他的dll文件,可以将第一个参数改为dll文件的路径;
还有就是要注意 Java 到 C 的类型的映射,可自行百度。。
这可能只是个最简单的小Demo,正在学习。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值