四时宝库

程序员的知识宝库

JAVA调用golang动态链接库(java调用go语言接口)

有些场景下如icmp使用java开发还是比较麻烦的,如果可以使用golang语言类库提供的能力那就比较方便,开发起来也比较轻松了。这里使用jdk19快要正式发布的foreign function代码实现,以prometheus blackbox exporter为例进行说明。

需求大概是这样,要做一个监控,主体或者是关键特性需要使用java实现,但ping功能希望使用blackbox exporter来实现,如果是独立运行也是可以,但为了考虑更好的管理,希望将exporter编译成动态链接库集成到JAVA中来使用,这样两者就充分融合了。

实现方式是这样

1、git下载

https://github.com/prometheus/blackbox_exporter

1、需要安装golangci-lint

2、linux下安装yum group install "Development Tools",windows下安装cygwin64,构选developmenet包进行安装

3、进入目录运行make初始化生成文件

4、修改main.go文件,使其可以输出动态链接库

import "C"


//export DoMain

func DoMain() {

args := [1]string{"javaw.exe"}

os.Args = args[:]

main()

}

6、 编译生成动态链接库

go build -ldflags '-w -s' -buildmode=c-shared -o blackbox.dll

7、使用jextacter辅助生成调用方法

首先下载https://jdk.java.net/jextract/

使用方法来创建类文件

jextract --source -l blackbox -t github.com.prometheus.blackboxexporter blackbox.h

8、使用JAVA调用

将jextact生成的文件放入项目中,使用下面的测试代码进行测试

package github.com.prometheus.blackboxexporter;


import static github.com.prometheus.blackboxexporter.blackbox_h.*;

import static org.junit.Assert.*;


import java.lang.foreign.MemorySession;


import org.junit.Test;


public class BlackboxTest {


@Test

public void testBlackbox() {

try (var session = MemorySession.openConfined()) {

DoMain();


}

}


}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接