java - 如何使用 JNA 为具有多个返回值的 go 函数编写接口(interface)

标签 java go jna multiple-return-values

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

假设 Go 函数是:

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

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

我能做什么?

最佳答案

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

关于java - 如何使用 JNA 为具有多个返回值的 go 函数编写接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49956986/

相关文章:

java - Gson解析数组字符串

file - 去安装: add non-source files to built package

go - 异步文件写入 Golang 中的 http.HandleFunc

java - 将自定义类型 Fortran 映射到 Java(使用 JNA)

java - Jsoup 嵌套表解析不适用于搜索页面结果表

java - 在 Spring Boot 中将 jsessonid cookie 设置为 SameSite=Strict 属性?

java - 类未实例化,无法使用 ActionListener 工作,单独工作正常

go - 将自定义类型类型转换为基本类型

java - JNA - C 内存错误导致 Java 程序崩溃

java - if 语句断言True/assertFalse