如何从java调用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
}
答案 0 :(得分:3)
可以在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