• 学习JNA,Jnative



    首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac 及javah命令,步骤繁琐2.JNA,Jnative相对简单只需要用实现接口,使用相对简单,但无论使用什么调用dll文件,比较令人头疼的都是JAVA与C之间类型对应与值对应。下面我将项目中对着JNA及jnative的使用总结下。


    1.JNA样码


    步骤如下:


    a,下载JNAjar文件,拷贝至系统根目录或者系统system32下

    b,代码很easy

    Java代码


    package com.cn.app;

    import com.sun.jna.Library;
    import com.sun.jna.Native;

    public class DLLTEST {

    // 1.实现PegRoute.dll 文件接口

    public interface PegRoute extends Library {

    // 2.PegRoute.dll 中 HCTInitEx方法
    public int HCTInitEx(int Version, String pStrCurrentDirectory);
    }

    public static void main(String[] args) {
    //3.加载DLL文件,执行dll方法
    PegRoute epen = (PegRoute) Native.loadLibrary("PegRoute",
    PegRoute.class);
    if (epen != null) {
    System.out.println("DLL加载成功!");
    int success = epen.HCTInitEx(0,"");
    System.out.println("1.设备初始化信息!" + success);
    }
    }
    }


    2.Jnative样码

    1.下载jnative。jar 及JNativeCpp.dll
    2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下
    3.样码

    Java代码

    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.exceptions.NativeException;
    import org.xvolks.jnative.Type;
    import org.xvolks.jnative.misc.basicStructures.LONG;

    public class JNativeT {

    static JNative PegRoute = null;

    public String init() throws NativeException, IllegalAccessException {
    try {
    if (PegRoute == null) {
    // 1. 利用org.xvolks.jnative.JNative来加载DLL:参数1.PegRoute为类名
    // 2.HCTInitEx方法名
    PegRoute = new JNative("PegRoute", "HCTInitEx");

    // 2.设置要调用方法中的参数:0 表示第一个以此类推
    LONG versionLong = new LONG(10);
    versionLong.setValue(0);

    PegRoute.setParameter(0, Type.LONG, versionLong.toString());
    PegRoute.setParameter(1, Type.STRING, "");

    // 3.设置返回参数的类型
    PegRoute.setRetVal(Type.INT);
    // 4.执行方法
    PegRoute.invoke();// 调用方法
    }
    System.out.println("调用的DLL文件名为:" + PegRoute.getDLLName());
    System.out.println("调用的方法名为:" + PegRoute.getFunctionName());
    // 5.返回值
    return PegRoute.getRetVal();
    } finally {
    if (PegRoute != null) {
    // 6.释放系统资源
    PegRoute.dispose();
    }
    }
    }

    public static void main(String[] args) throws NativeException,
    IllegalAccessException {

    String mm = new JNativeT().init();
    System.out.println(mm);
    }
    }

  • 相关阅读:
    mitmproxy抓包工具
    java基础|int和Integer的区别
    Vue|退出功能
    Vue|分页处理
    apt-get本地软件源搭建
    rqt_plot报错
    创建ROS 工作空间时出现:程序“catkin_init_workspace”尚未安装,程序“catkin_make”尚未安装。
    ubuntu16.04安装ROS
    debian及Ubuntu各版本下载地址获取
    解决sudo rosdep init和rosdep update的错误
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4049647.html
Copyright © 2020-2023  润新知