How to call go function from java using Java native interface?

前端 未结 1 823
陌清茗
陌清茗 2021-02-03 16:44

It is possible to call C methods through JNA interface in Java. My question is how I can reach the same functionality with Go?

package main

import \"fmt\"

impo         


        
1条回答
  •  孤城傲影
    2021-02-03 16:47

    After review of the documentation about Go Shared Libraries

    It is possible to integrate the call Golang functions from Java Spring Batch, below a short example:

    Golang function:

    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
    }
    

    After that, execute the command to generate the binary files:

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

    This generates the binary files:

    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
    

    Finally, create the JNA class:

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

    After that, execute from Main Java class, 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 ', or link it with '-z noexecstack'.
    Java says: about to call Go ..
    Go says: adding 30 and 12
    Java says: result is 42
    

    0 讨论(0)
提交回复
热议问题