打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi)

JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi)

来源:互联网 作者:佚名 时间:2015-06-28 00:42
1. JNR简单介绍 继上文“ JNI的替代者—使用JNA访问Java外部函数接口 ”,我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口。它管理着JVM和非托管的本地环境之间的边界,提供数据编组和对象生命周期管理协议
1. JNR简单介绍

继上文“JNI的替代者—使用JNA访问Java外部函数接口”,我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口。它管理着JVM和非托管的本地环境之间的边界,提供数据编组和对象生命周期管理协议。

根据JEP(JDK增强提案) 191,JNI在下列几个方面最令开发人员痛苦:

因此JNI创建本地函数的方式并不简单,于是产生了像Java Native Access(JNA)和Java Native Runtime(JNR)这样的库。JNA和JNR都是基于JNI创建的,而JEP 191定义的Java Foreign Function Interface(FFI)可能会基于JNR。使用FFI API而不是JNI绑定本地代码和内存将成为开发人员更喜欢的方式。

FFI API将提供下列特性:

对Java FFI的需求已经产生了JNA和JNR库。JNA库应用更广泛(具体使用参见“JNI的替代者—使用JNA访问Java外部函数接口”)。JNR库更全面,因为它实现了不同层次的抽象,提供了函数和内存元数据,对库和函数绑定进行了抽象。JNR已经在JRuby项目中大量使用,它可能会成为JEP 191的基础。

上面段落来自JEP 191的描述(由参考文献(1)翻译),由此可见虽然JNA使用广泛,但JNR可能更渐趋势,也许在不久的将来JNR-FFI(jffi)就会内建在JDK中与JNI一样成为Java访问外部函数的标准接口。因此,学习使用JNR是非常有必要的。

JNR-FFI项目也托管自Github,其使用方法与JNA差不多,不过JNR并没有给出相应的jar包,需要我们自己打包使用。

2. JNR项目打包(jnr-ffi.jar)——如何打包Github上的maven项目

首先要明确,Github上托管的项目一般是用maven管理构建的,而不是Eclipse/MyEclipse,因此如果你想通过从Github上直接下载项目源码(Download Zip的方式下载)然后导入或拷贝进Eclipse里打包是行不通的。我一开始也是这么做的,发现项目不完整,缺少一些包,因此打成的jar包也是不能用的。

让我惊讶的,在maven官方库里的jnr-ffi.jar包也是不完整的,下载下来也不能用,还有这个地方的所有jnr包,我都试过了,全部不完整,因此只能自己打包。

在打包之前,你首先需要将完整的源码下载下来,然后有两种方式打包成jar文件。

  • 将maven项目导入Eclipse中打包

  • 通过maven命令mvn打包

  • 两种方法都有需要注意的地方。不熟悉maven的人可以采取第一种方式,上手简单。熟悉maven的当然推荐用mvn命令打包,不过需要注意这里有第三方依赖包,不是一句简单的命令就可搞定。

    将maven项目导入Eclipse中打包

    注意:虽然Eclipse内置了Maven插件,但表示不太好用,经常出现问题,建议卸载Eclipse的自带的maven插件,然后安装第三方的m2eclipse插件,该插件目前有效的安装地址为:,通过Eclipse中Help—Install New Software...—Add Repository安装即可。

    有了maven插件后,打包的具体步骤如下:

    (1)从Github下载源码

    这个其实非常关键,因为不能通过“Download Zip”的方式直接从Github网页上下载,这样下载的源码缺少很多j依赖的ar包,,需要通过git clone的方式下载

    git clone https://github.com/jnr/jnr-ffi.git

    下载后的项目源码就在当前命令行路径下。

    (2)导入maven项目

    将刚下载的完整的jnr源码导入到Eclipse中,注意导入的是Maven项目

    选择刚下载的项目根路径

    这里出现了错误,如果没错的就可以直接打包了,如果跟我一样出现下面的错误,那么请继续

    从出错信息可以看出是缺少Maven-antrun插件,这是Maven的ant插件,用来自动构建项目的,没有这个插件,maven配置文件pom.xml中的<execution></execution>之间的任务就执行不了,因此如果忽略这个出错继续点“Finish”那么pom.xml文件就有错误,具体的出错信息如下:

    Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.1:run (execution: default, phase: test-compile)

    这里有官方给出的解决方案,我就直接用第一种方法:在<plugins>前面加上<pluginManagement>,在</plugins>后面加上加上</pluginManagement>  即可。

    其实我的Eclipse工程里还有另外一个错误,就是在NativeClosureFactory.java文件中:

    The method expunge(NativeClosureFactory.ClosureReference, Integer) in the type NativeClosureFactory is not applicable for the arguments (NativeClosureFactory<T>.ClosureReference, Integer)

    属于Java泛型错误,不知道完整的代码你可能不知道具体的问题所在,下面举个简单的例子:

    public final class Native<T> {private void test1(Ref ref, Integer key) {}final class Ref {private final Native factory;private Ref(Native factory) {this.factory = factory;}public void test2() {factory.test1(this, 1);}}}

    你能看出问题所在吗?Native类是个泛型类,但在其内置类Ref中使用时没有加上泛型的标志,将Native当作普通类使用,忽略了泛型<T>标志。其实这可能与Java编译器有关,有的版本可能不会报这个错,那么改正方法也很简单,将

    本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    【转】如何在android上支持JNA <一>知识准备
    java调用底层的几种方法
    JNA示例
    JNA—JNI终结者
    JNI的替代者
    几种java调用dll的方式
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服