JNA简介

简介:

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*作为出参时需要知道对应的字符串长度在获得内容时使用。



目录
相关文章
|
Java 测试技术 C#
【开发者笔记】java 利用jna调用c#的dll
          一、需求阐述:   如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需求。
17303 0
|
Java Go 开发工具
MacOS Java+golang build protoc gRPC 代码生成
MACOS Java+golang GRPC 代码生成 下载protobuf git clone https://github.com/protocolbuffers/protobuf.git git checkout 3.
4202 0
|
Linux
全网首发:LINUX编译JNA:编译产生jna.jar
全网首发:LINUX编译JNA:编译产生jna.jar
90 0
JNA简单范例
JNA简单范例
63 0
|
IDE Java 测试技术
第六章 Java Gradle插件
我们已经知道,Gradle是一个非常灵活的构建框架,他提供了构建的基础核心,为了对具体的业务进行构建,Gradle在此基础上提供了插件的概念,这样就能基于Gradle进行很好的扩展,而不改变其核心基础,又能满足不同业务的需要,这也是我们在架构中参考的。
206 0
第六章 Java Gradle插件
java高级用法之:JNA中的Structure
前面我们讲到了JNA中JAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native中的数据类型是复杂的struct类型该如何进行映射呢? 不用怕,JNA提供了Structure类,来帮助我们进行这些映射处理。
|
监控 IDE Java
JDK14中的java tools简介
JDK14中的java tools简介
|
NoSQL Java Linux
Java Windown 开发环境搭建
Java Windown 开发环境搭建
542 2
|
Linux
LINUX编译JNA产生jna.jar
LINUX编译JNA产生jna.jar
129 0