当前位置: 首页 > 面试题库 >

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

墨承泽
2023-03-14
问题内容

可以通过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


 类似资料:
  • 问题内容: 我有Clojure功能。 源代码: https://github.com/8protons/url62/blob/master/src/url62/core.clj 我需要从Java执行此功能。 我尝试使用这样的代码: 但这不起作用: 问题答案: 您忘记了Clojure命名空间: 这是项目结构: 和文件: 这是调用嵌入式Clojure函数的Java类: Clojure文件: Cloju

  • 问题内容: 我需要从Java调用C#函数,为此,我创建了以下代码。我有一个创建的Java头文件Authenticator.h,代码如下: 然后,我创建了一个身份验证的C#函数 然后,我尝试使用以下代码从C ++(项目创建dll)中调用C#函数; 最后创建一个需要从Java调用的dll。该dll已创建,并且可以在Java中很好地加载它,但是在Java中却收到此错误日志。我可能会错过什么。 问题答案:

  • 问题内容: 如何从C ++应用程序调用Java函数? 我知道从CMD(或类似技术)调用它们的方法,但我宁愿不使用它们。 问题答案: 例如,检查从C创建JVM。它显示了创建JVM和调用方法的示例过程。如果JVM已经存在;例如,您的C程序被Java程序调用(回调情况),则可以缓存JNIEnv *指针。 作为建议,请小心从C / C ++缓存指向JVM的指针,其中涉及到一些有关可以缓存的内容的语义,以后

  • 它说“jvm堆栈与本机堆栈相同”,如果是这样的话,那么当字节码中有函数调用而不是jvm代码函数调用时,jvm如何在堆栈内存上分配堆栈帧。如果JVM代码中有一个函数调用,那么方法、局部变量和其他与方法相关的东西将由OS存储在本机堆栈中。但是,如果字节码指令中有一个函数调用,JVM如何手动将本地文件存储在本机堆栈中。

  • 问题内容: 我很清楚如何用C ++扩展Python,但是如果我想用Java编写要与numpy一起使用的函数怎么办? 这是一个简单的场景:我想使用Java类来计算numpy数组的平均值。如何将numpy向量传递给Java类并收集结果? 谢谢你的帮助! 问题答案: 我花了一些时间回答自己的问题,并希望分享我的答案,因为我觉得关于 stackoverflow的 这个主题的信息不多。我还认为,由于Java

  • 问题内容: 是否可以从Javascript调用Java(GWT)方法?从文档中也不清楚。http://code.google.com/intl/zh- CN/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html上的 所有示例都演示了如何从JSNI(而非JS)函数调用Java函数。 更新1 这是一个Java代码: 这是html中的呼叫者按钮示例: 这