java - 如何使用 Java native 接口(interface)从 Java 调用 Go 函数?

标签 java go jna

可以通过 JNA 调用 C 方法Java 中的接口(interface)。如何使用 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对Go函数的调用。下面是一个简短的例子:

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 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);
  }
}

之后,从主 Java 类执行。结果:

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 native 接口(interface)从 Java 调用 Go 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49986729/

相关文章:

java - 为什么我的值没有从内部类添加到全局 ArrayList

go - 如何在golang的x509证书中解码复合自定义扩展?当前代码错误为 : asn1: structure error: sequence tag mismatch

go - Go 中通过和失败的测试用例列表

java - 如何使用 JNA 调用 GetRawInputDeviceInfo?

java - 我写了两段代码,几乎一模一样,但其中一段运行速度比另一段快得多(Java)

java - 如何从 Hibernate 用户类型检测数据库?

java - api中接口(interface)与实现分离

自动将结构转到 OpenAPI 到 JSONSchema 生成

java - 是否可以注释导出的函数名称?

clojure - 在 Clojure 中扩展(而不是实现)Java 接口(interface)