Java调用dll动态链接库——JNA框架

1.JNA框架

  a.定义:JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

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

  c.导入maven依赖

  <dependencies>

    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna</artifactId>
      <version>5.3.1</version>
    </dependency>
    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna-platform</artifactId>
      <version>5.3.1</version>
    </dependency>

    ......

  </dependencies>

 

 

2.调用系统自带动态链接库

public class TestPrintf {

    public interface CLibrary extends Library {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
        CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        // 声明将要调用的DLL中的方法(可以是多个方法)
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

 

 

3.调用自定义dll

  a.在VC2019中创建新项目,命名为TestDll1

 

 

  b.创建头文件 test.h

#pragma once

#define MYLIBAPI extern "C" _declspec(dllexport) 
MYLIBAPI int sum(int a, int b);

 

 

  c.创建源文件 test.cpp

#include "pch.h"
#include "test.h"
#include <stdio.h>

int sum(int a, int b) {
    return a + b;
}

 

 

  d.在工具栏选择x64(32位则选择x86)

 

 

  e.点击项目TestDll1,右键选择“生成”,生成dll

 

 

  f.将生成的dll放入resource中

  g.创建测试类

public class TestDll {

    public interface TestDllLib extends Library {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
        TestDllLib INSTANCE = (TestDllLib) Native.load("TestDll1", TestDllLib.class);
        // 声明将要调用的DLL中的方法(可以是多个方法)
        int sum(int a, int b);
    }

    public static void main(String[] args) {
        int result = TestDll.TestDllLib.INSTANCE.sum(2, 3);
        System.out.println("result: " + result);
    }

}

 

  h.注意:运行前需要用maven执行 clean package,保证 dll 打包进 target 中,不然可能报无法找到dll的错误

 

  i.JNA数据类型对应关系

 

 

  i.参考文档:https://blog.csdn.net/shendl/article/details/3589676

posted @ 2019-06-25 17:25  晨M风  阅读(6359)  评论(0编辑  收藏  举报