Вернуть карту из Голанга в Java, используя Native Library, передав строку в качестве ввода из Java - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь вызвать функцию Golang из Java-программы. Ссылка используется. И это прекрасно работает.

С этим я пытаюсь вернуть карту из Голанга в Яву. С возвращаемым типом в Java, являющимся объектом / картой, ничего не работало. На самом деле исключение (может быть, время компиляции):

Exception in thread "main" java.lang.IllegalArgumentException: Unsupported return type interface java.util.Map in function GetGeoLoc
        at com.sun.jna.Function.invoke(Function.java:490)
        at com.sun.jna.Function.invoke(Function.java:360)
        at com.sun.jna.Library$Handler.invoke(Library.java:244)
        at com.sun.proxy.$Proxy0.GetGeoLoc(Unknown Source)
        at com.java.readers.GetGeoLoc2Tests.getGeoLoc2(GetGeoLoc2Tests.java:39)
        at com.java.readers.GetGeoLoc2Tests.main(GetGeoLoc2Tests.java:52)

Ну, кто-нибудь, помогите мне с выходом. Я полагаю, что я что-то здесь упускаю.

Вот код

Java:

public class GetGeoLoc2Tests {

    static GoCaller GO_CQM_TRANSFORMER;

    public interface GoCaller extends Library {
        public Map<String, String> GetGeoLoc(GoString.ByValue ip);
        public int Add(int i);
        public String SString(GoString.ByValue s);

        public class GoString extends Structure {
            public static class ByValue extends GoString implements Structure.ByValue {
            }

            public String ip;
            public long n;

            protected List getFieldOrder() {
                return Arrays.asList(new String[] { "ip", "n" });
            }
        }
    }

    public static void getGeoLoc2(String ip) {

        if (ip == null) {
            return;
        }

        GoCaller.GoString.ByValue str = new GoCaller.GoString.ByValue();
        str.ip = ip;
        str.n = str.ip.length();

        System.out.println("JAVA----->" + ip);
        Map<String, String> map = GO_CQM_TRANSFORMER.GetGeoLoc(str);
        System.out.println(map);
    }

    public static void main(String[] args) {
        if(args.length == 0) {
            System.out.println("Expecting an input<IpAddress>");
            System.exit(0);
        }

        String pwd = System.getProperty("user.home");
        String lib = pwd + "/go/src/ip2loc/iploc.so";
        GO_CQM_TRANSFORMER = (GoCaller) Native.loadLibrary(lib, GoCaller.class);
//      System.out.println(GO_CQM_TRANSFORMER.Add(10));
        getGeoLoc2(args[0]);
    }

Golang:

package main

import "C"

import (
        "fmt"
        "github.com/ip2location/ip2location-go"
)

func main(){}

//export GetGeoLoc
func GetGeoLoc(ip string) string {
        ip2location.Open("/data/md0/ip2loc/ip6/IPV6-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-ISP-DOMAIN-NETSPEED-AREACODE-WEATHER-MOBILE-ELEVATION-USAGETYPE.BIN")
        //ip1 := "8.8.8.8"
        fmt.Println("input:" , ip)
        results := ip2location.Get_all(ip)

        m := make(map[string]string)
        m["country_short"] = results.Country_short
        m["country_long"] = results.Country_long
        m["region"] = results.Region
        m["city"] = results.City
        m["isp"] = results.Isp
        m["latitude"] = fmt.Sprintf("%f", results.Latitude)
        m["longitude"] = fmt.Sprintf("%f", results.Longitude)
        m["domain"] = results.Domain
        m["zipcode"] = results.Zipcode
        m["timezone"] = results.Timezone
        m["netspeed"] = results.Netspeed
        m["iddcode"] = results.Iddcode
        m["areacode"] = results.Areacode
        m["weatherstationcode"] = results.Weatherstationcode
        m["weatherstationaname"] = results.Weatherstationname
        m["mcc"] = results.Mcc
        m["mnc"] = results.Mnc
        m["mobilebrand"] = results.Mobilebrand
        m["elevation"] = fmt.Sprintf("%f", results.Elevation)
        m["usagetype"] = results.Usagetype

        fmt.Println("map:", m)
        ip2location.Close()
        return m

При выполнении печатает вывод «m», который является картой. Вопрос в том, как вернуть этот map m в метод Java как HashMap? Спасибо

...