如何使用Java本机接口从Java调用go函数?

可以通过Java中的JNA接口调用C方法。我的问题是,如何使用Go达到相同的功能?

package main

import "fmt"

import "C"

//export Add

func Add(x, y int) int {

fmt.Printf("Go says: adding %v and %v\n", x, y)

return x + y

}

回答:

阅读有关Go Shared

Libraries的文档后

下面是一个简短的示例,可以集成Java Spring Batch中的调用Golang函数:

Golang函数:

package main

import "fmt"

import "C"

//export Add

func Add(x, y int) int {

fmt.Printf("Go says: adding %v and %v\n", x, y)

return x + y

}

之后,执行命令生成二进制文件:

go build -buildmode=c-shared -o bin/lib-cqm-transformer.so src/cqm_transformer.go

这将生成二进制文件:

ls -la bin/

total 2860

drwxrwxr-x 2 dmotta dmotta 4096 abr 23 01:13 .

drwxrwxr-x 5 dmotta dmotta 4096 abr 23 00:35 ..

-rw-r--r-- 1 root root 1558 abr 23 01:13 lib-cqm-transformer.h

-rw-r--r-- 1 root root 2915112 abr 23 01:13 lib-cqm-transformer.so

最后,创建JNA类:

package com.XX.XX.batch.engine.transformer;

import com.sun.jna.Library;

import com.sun.jna.Native;

public class GoEngineTransformerTest {

static GoCqmTransformer GO_CQM_TRANSFORMER;

static {

String os = System.getProperty("os.name").toLowerCase();

String libExtension;

if (os.contains("mac os")) {

libExtension = "dylib";

} else if (os.contains("windows")) {

libExtension = "dll";

} else {

libExtension = "so";

}

String pwd = System.getProperty("user.dir");

String lib = pwd + "/golang/bin/lib-cqm-transformer." + libExtension;

GO_CQM_TRANSFORMER = (GoCqmTransformer) Native.loadLibrary(lib, GoCqmTransformer.class);

}

public interface GoCqmTransformer extends Library {

long Add(long x, long y);

}

public static void main(String[] args) {

System.out.println("Java says: about to call Go ..");

long total = GO_CQM_TRANSFORMER.Add(30, 12);

System.out.println("Java says: result is " + total);

}

}

之后,从Main Java类中执行Results:

Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /tmp/jna1412558273325390219.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.

It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.

Java says: about to call Go ..

Go says: adding 30 and 12

Java says: result is 42

以上是 如何使用Java本机接口从Java调用go函数? 的全部内容, 来源链接: utcz.com/qa/427887.html

回到顶部