spring boot项目调用go

2,319 阅读2分钟

spring boot项目使用的是java语言,而Java不能直接调用go的;有一个间接调用的方式,就是先把go代码编译成动态链接库,windows是dll文件,linux是so文件。使用java的本地调用来实现,常用的有java原生的jni,和oracle的三方库jna,本文以jna为例说明。

过程

参考Java调用Golang生成的动态库(dll,so)

注意

上面的博文只讲了java如何调用,但是spring调用和java调用有所不同,我们希望(dll,so)文件随工程一起打成jar包后仍旧可用。经过实践,发现主要有两个问题,一个是文件路径问题(放在哪),另一个是操作系统环境问题,让我们一起来逐个解决。假如我们编程成的动态链接库名字是testSdk.dll和testSdk.so。java接口大致如下:

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

public interface InnoEncryptSdkLib extends Library {

    InnoEncryptSdkLib INSTANCE = Native.load("testSdk", InnoEncryptSdkLib.class);
    
    //接口方法
    ...
}

注意上面的资源名是不带扩展名的(即后缀),只写文件名testSdk即可。

1.文件路径问题

a.Linux环境:resources\linux-x86-64\libtestSdk.so

b. windows环境:resources\win32-x86-64\testSdk.dll

即在resources包下,新建两个文件夹linux-x86-64和win32-x86-64,testSdk.dll放到win32-x86-64下面,testSdk.so文件放到linux-x86-64下面。眼尖的小伙伴,可能已经发现你的linux-x86-64放的不是testSdk.so而是libtestSdk.so,那是不是写错了呢。这就是我们要说的第二个问题:

2. 操作系统环境问题

linux操作系统,在jna调用的时候,如没有完整指定so文件名(即包含后缀),那么系统寻找的便是名为libtestSdk.so的动态库,而不是testSdk.so文件。也就是自动加上lib前缀和.so后缀,所以需要将testSdk.so文件重名名为libtestSdk.so文件(不用重新编译,直接重名名就行),放到指定位置即可。

好了,这样就可以放心的使用我们编译好的动态库了。