java 高级用法之: 在 JNA 中将本地方法映射到 JAVA 代码中

本文介绍了如何在Java中使用JNA将本地方法映射到Java代码中,包括Library Mapping、Function Mapping和Invocation Mapping。通过Library Mapping的Interface和Direct Mapping方式加载本地库,Function Mapping实现方法映射,以及Invocation Mapping允许自定义调用配置。文章还讨论了防止VM崩溃的保护机制和性能考虑,提示开发者在使用JNA时权衡效率和灵活性。
摘要由CSDN通过智能技术生成

 

简介

不管是 JNI 还是 JNA,最终调用的都是 native 的方法,但是对于 JAVA 程序来说,一定需要一个调用 native 方法的入口,也就是说我们需要在 JAVA 方法中定义需要调用的 native 方法。

小伙伴们有兴趣想了解以下更多相关学习资料请点赞收藏+评论转发+关注我之后
私信我,注意回复【000】即可获取更多免费资料!

对于 JNI 来说,我们可以使用 native 关键字来定义本地方法。那么在 JNA 中有那些在 JAVA 代码中定义本地方法的方式呢?

Library Mapping

要想调用本地的 native 方法,首选需要做的事情就是加载 native 的 lib 文件。我们把这个过程叫做 Library Mapping,也就是说把 native 的 library 映射到 java 代码中。

JNA 中有两种 Library 映射的方法,分别是 interface 和 direct mapping。

先看下 interface mapping,假如我们要加载 C library, 如果使用 interface mapping 的方式,我们需要创建一个 interface 继承 Library:

public interface CLibrary extends Library {
      CLibrary INSTANCE = (CLibrary)Native.load("c", CLibrary.class);}

复制代码

上面代码中 Library 是一个 interface,所有的 interface mapping 都需要继承这个 Library。

然后在 interface 内部,通过使用 Native.load 方法来加载要使用的 c library。

上面的代码中,load 方法传入两个参数,第一个参数是 library 的 name,第二个参数是 interfaceClass.

下面的表格展示了 Library Name 和传入的 name 之间的映射关系:

事实上,load 还可以接受一个 options 的 Map 参数。默认情况下 JAVA interface 中要调用的方法名称就是 native library 中定义的方法名称,但是有些情况下我们可能需要在 JAVA 代码中使用不同的名字,在这种情况下,可以传入第三个参数 map,map 的 key 可以是 OPTION_FUNCTION_MAPPER,而它的 value 则是一个 FunctionMapper ,用来将 JA

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值