目录
1.JNA概述
JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说它是JNI的替代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。
JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。
原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。
JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,你不再需要编写C动态链接库。
也许这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。但总体影响不大,因为JNA也避免了JNI的一些平台配置的开销。
2. 创建SpringBoot基础工程
2.1 创建Maven工程
2.2 配置Maven地址
2.3 设置自动导入包
2.4 设置启动注解
2.5 引入依赖
<!--引入springboot依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<!--引入spring-boot启动器依赖, 添加启动器后web工程常用的依赖会自动帮你引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.6 编写启动类
package com.miaxis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args ) {
SpringApplication.run(Application.class, args );
}
}
3. 引入JNA依赖
<!--jna-->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version>
</dependency>
4. 动态库存放路径
-
项目中放在resource目录下
-
或者放在resources\win32-x86-64目录下
5. JNA接口代码
package com.miaxis.jna;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public interface MXFingerAlgAPI extends Library {
MXFingerAlgAPI myinstance = (MXFingerAlgAPI) Native.loadLibrary(
Platform.isWindows() ? "MXFingerAlg" : "MXFingerAlg_linux64.so", MXFingerAlgAPI.class);
/**
* @function Get the version of the algorithm
* @param strVersion - [out], version(100bytes)
* @return 0-success, other-failed (see ErrorCode.h)
*/
public int zzGetVersion(byte[] szVersion);
}
6. 测试控制类
package com.miaxis.controller;
import com.miaxis.jna.MXFingerAlgAPI;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(tags = "测试组")
public class HelloController {
@GetMapping("algversion")
public String algversion() {
byte[] bAlgVersion = new byte[100];
MXFingerAlgAPI.myinstance.zzGetVersion(bAlgVersion);
System.out.println("finger_alg_version: " + new String(bAlgVersion));
return new String(bAlgVersion);
}
}