博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNA简介
阅读量:6094 次
发布时间:2019-06-20

本文共 2012 字,大约阅读时间需要 6 分钟。

JNA

JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

  • 优点:JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。
  • 缺点:JNA是建立在JNI的基础之上的,所以效率会比JNI低。

关键代码

import com.sun.jna.Library;import com.sun.jna.Memory;import com.sun.jna.Native;import com.sun.jna.Pointer;import com.sun.jna.ptr.IntByReference;public class LYTest {    public interface CLibrary extends Library {        CLibrary INSTANCE = (CLibrary)Native.loadLibrary("ly_icparse",CLibrary.class);        int Parse(String databuf,IntByReference ickh,IntByReference quantity,IntByReference fc,Pointer cid);        int Build(int ickh, int quantity, int fc, String cid, Pointer databuf);    }    public static void main(String[] args) throws Exception {        //用于接收输出的char*        Pointer databuf = new Memory(512);          CLibrary.INSTANCE.Build(20133058, 11, 3, "201013000285", databuf);        byte[] byteArray = databuf.getByteArray(0, 512);        String data = new String(byteArray,"UTF-8");        System.out.println("data:"+data);        //构建读卡数据        String databufstr = "A2131091FFFF8115FFFF201013000285FFFFFFFFFFD27600000400FFFFFFFFFF"+data.substring(64,512);        IntByReference ickh = new IntByReference();        IntByReference quantity = new IntByReference();        IntByReference fc = new IntByReference();        Pointer cid = new Memory(12);        int result = CLibrary.INSTANCE.Parse(databufstr, ickh, quantity, fc, cid);        String cidstr =  new String(cid.getByteArray(0, 12),"UTF-8");        System.out.println("ickh:"+ickh.getValue());        System.out.println("quantity:"+quantity.getValue());        System.out.println("fc:"+fc.getValue());        System.out.println("cid:"+cidstr);        System.out.println("result:"+result);    }}

说明

常用的c于java参数对应关系

c参数 java参数 说明
int* IntByReference 出参,入参直接用int
char* Pointer/Memory 出参,入参直接用String

char*作为出参时需要知道对应的字符串长度在获得内容时使用。



转载地址:http://otwza.baihongyu.com/

你可能感兴趣的文章
iOS中如何根据UIView获取所在的UIViewController
查看>>
聊聊spring cloud gateway的RouteLocator
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Android Annotation扫盲笔记
查看>>
React 整洁代码最佳实践
查看>>
聊聊架构设计做些什么来谈如何成为架构师
查看>>
Java并发编程73道面试题及答案
查看>>
iOS知识小集·设置userAgent的那件小事
查看>>
移动端架构的几点思考
查看>>
Tomcat与Spring中的事件机制详解
查看>>
Spark综合使用及用户行为案例区域内热门商品统计分析实战-Spark商业应用实战...
查看>>
初学者自学前端须知
查看>>
Retrofit 源码剖析-深入
查看>>
Rust官方公布Rust1.0最新状态报告和最终时间表
查看>>
使用PHPWord对Word文件做模板替换
查看>>
Dubbo Mesh在闲鱼生产环境的落地实践
查看>>
Windows Server 2008 \u0026 2012在GCE上正式商用了
查看>>
The Agile Mind-Set作者访谈
查看>>
Xamarin发布支持64位的iOS/Mac统一API
查看>>
Firefox 38发布,支持DRM
查看>>