可以通过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函数:
之后,执行命令生成二进制文件:
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