1、首先,准备服务部署环境,这里将Springboot项目打包jar部署到Linux服务器上,Linux需要安装C环境用来生成SO文件。
Linux安装C语言环境
[root@localhost ~]# sudo yum groupinstall "Development Tools"
检查版本信息
[root@localhost ~]# gcc -v
2、接下来,在开发工具上编写C文件,这里用到一个.h头文件和一个.c文件
.h头文件,类似于java中的接口,定义方法
#include "stdio.h"
int add(int a ,int b);
.c文件,实现.h文件定义的方法,注意方法名、返回类型、参数一致。
#include"add.h"
int add(int a , int b){
int c;
c=a+b;
return c;
}
3、将这两个文件传送到Linux服务器上,进行编译成.SO库,SO库命名是lib加上.c文件的名字,如:add.c文件编译后是libadd.so。/home/jenkins/usr/local/jdk1.8是Linux的JAVA环境变量,根据自己的环境目录路径进行配置。
[root@localhost local]# gcc -shared -I /home/jenkins/usr/local/jdk1.8/include -I /home/jenkins/usr/local/jdk1.8/include/linux add.c -o libadd.so
4、将生成的libadd.so复制到/usr/lib/目录下, 这里也可以自己配置调用SO库系统环境路径。
[root@localhost local]# cp libadd.so /usr/lib/
5、创建一个Springboot项目,引用JNA的pom依赖,JNA框架是JNI的封装,调用简单。
<!--jna调用so库-->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
6、创建一个CLibrary接口,实现Library类,定义add.h头文件的方法,注意方法的名字、参数、返回类型要一致。
package com.test.demo.CLibraryInterface;
import com.sun.jna.Library;
public interface CLibrary extends Library {
int add(int x ,int y);
}
7、接下来,在service层需要调用SO库中的方法时,用Native.load("add",CLibrary.class)方法实现接口CLibrary,通过CLibrary直接调用SO库中的方法。
@Service
public class AddServiceImpl implements AddService {
CLibrary INSTANCE = (CLibrary) Native.load("add",CLibrary.class);
@Override
public int add(int x, int y) {
int add = INSTANCE.add(x, y);
return add;
}
}
8、通过Controller层调用service层来调用这个方法
@RestController
public class AddController {
@Autowired
private AddService addService;
@RequestMapping("add")
public String getAdd(){
int add = addService.add(1, 5);
return ""+add;
}
}
9、修改application.properties配置文件,将server.address修改成Linux服务器地址,因为要在Linux上启动。
server.port=8954 //端口号
server.address=192.168.159.155 //服务器地址
spring.application.name=testAdd //服务名字
10、将项目打包jar,放在Linux服务器上,到jar包目录下通过Java -jar jar包名 启动服务。
[root@localhost jar]# java -jar demo-0.0.1-SNAPSHOT.jar
11、这里用的是虚拟机Linux,还要配置NAT做一个端口的转发,用于访问Linux上的服务。
11、最后,我们通过访问:ip地址+端口号+方法名 就可以访问了。