【util】Java调用Golang生成的动态库(DLL,SO)

本文详细介绍了如何在Java中通过JNA库调用用Go编写的动态库,包括环境准备、编写Go程序、构建动态库以及创建Java接口和实际调用过程,最终展示了成功执行的示例和运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果展示

在这里插入图片描述

环境准备

gcc -v

如果提示命令没有找到,那么你的电脑里没有gcc,去安装一个,gcc官网:https://gcc.gnu.org/
如果没安装过gcc的朋友可以直接安装win-build,可以帮你快速安装官网:https://www.mingw-w64.org/downloads/#mingw-builds

编写程序

package main

import "C"

//export Sum
func Sum(a int, b int) int {
	return a + b
}

//export Cut
func Cut(a int, b int) int {
	return a - b
}

//export Hello
func Hello(msg string) *C.char {
	return C.CString("hello : " + msg)
}

func main() {

}

注意:即使要编译成动态库,也必须要有main函数。上面的导入“C”必须存在并且必须被注释//export Hello

构建动态库

Windows动态库

go build -buildmode=c-shared -o libhello.dll libhello.go

执行以下命令生成DLL动态链接库:

Linux/Unix/macOS 动态库

执行如下命令生成 SO 动态库:

go build -buildmode=c-shared -o libhello.so .\libhello.go

java中调用

引用JNA

<dependency>
	<groupId>net.java.dev.jna</groupId>
	<artifactId>jna</artifactId>
	<version>4.5.2</version>
</dependency>

创建接口

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

public interface LibHello extends Library {
	LibHello INSTANCE = (LibHello) Native.loadLibrary("E:/resources/libhello", LibHello.class);

	int Sum(int a, int b);
	int Cut(int a, int b);
	String Hello(GoString.ByValue msg);
}

  • GoString
import com.sun.jna.Structure;

import java.util.ArrayList;
import java.util.List;

public class GoString extends Structure {

	public String str;
	public long length;

	public GoString() {
	}

	public GoString(String str) {
		this.str = str;
		this.length = str.length();
	}

	@Override
	protected List<String> getFieldOrder() {
		List<String> fields = new ArrayList<>();
		fields.add("str");
		fields.add("length");
		return fields;
	}

	public static class ByValue extends GoString implements Structure.ByValue {
		public ByValue() {
		}

		public ByValue(String str) {
			super(str);
		}
	}


	public static class ByReference extends GoString implements Structure.ByReference {
		public ByReference() {
		}

		public ByReference(String str) {
			super(str);
		}
	}
}

调用接口

public class App {
	public static void main(String[] args) {
		System.out.println(LibHello.INSTANCE.Sum(222, 333));
		System.out.println(LibHello.INSTANCE.Cut(666, 333));
		System.out.println(LibHello.INSTANCE.Hello(new GoString.ByValue("Go")));
	}
}

运行结果:

555
333
hello : Go

Process finished with exit code 0

参考文档

java-calls-golang-generated-dynamic-library-dllso

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掘金者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值