0

我正在尝试使用JNA导出一些 Go 函数并在 Java 中调用它们,但我不知道如何在 Java 中为具有多个返回值的 Go 函数定义接口。

假设 Go 函数是:

//export generateKeys
func generateKeys() (privateKey, publicKey []byte) {
    return .....
}

返回值有两项,但在 Java 中,只允许返回一项。

我能做些什么?

4

1 回答 1

1

cgo为多个返回值创建一个专用的 C 结构,并将各个返回值作为结构元素。

在您的示例中,cgo将生成

/* Return type for generateKeys */
struct generateKeys_return {
    GoSlice r0; /* privateKey */
    GoSlice r1; /* publicKey */
};

并且该函数将具有不同的签名,然后您可以通过 JNA 使用该签名

extern struct generateKeys_return generateKeys();

在您的 JNA 定义中,您将类似于使用 JNA 概念(未经测试的代码)的结构:

public interface Generator extends Library {

        public class GoSlice extends Structure {
            public Pointer data;
            public long len;
            public long cap;
            protected List getFieldOrder(){
                return Arrays.asList(new String[]{"data","len","cap"});
            }
        }

        public class GenerateKeysResult extends Structure {
            public GoSlice privateKey;
            public GoSlice publicKey;
            protected List getFieldOrder(){
                return Arrays.asList(new String[]{"privateKey","publicKey"});
            }
        }

        public GenerateKeysResult generateKeys();
}
于 2018-04-21T15:19:23.673 回答