如何使用 JNA 为具有多个 return 值的 go 函数编写接口
How to write interface for a go function with multi return values with JNA
我正在尝试导出一些 Go 函数并在 Java 中调用它们,使用 JNA,但我不知道如何在 Java 中定义接口Go 具有多个 return 值的函数。
假设 Go 函数是:
//export generateKeys
func generateKeys() (privateKey, publicKey []byte) {
return .....
}
return值有两项,但在Java中,只允许有一项return值。
我能做什么?
cgo
为多个 return 值创建一个专用的 C 结构,每个 return 值作为结构元素。
在您的示例中,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();
}
我正在尝试导出一些 Go 函数并在 Java 中调用它们,使用 JNA,但我不知道如何在 Java 中定义接口Go 具有多个 return 值的函数。
假设 Go 函数是:
//export generateKeys
func generateKeys() (privateKey, publicKey []byte) {
return .....
}
return值有两项,但在Java中,只允许有一项return值。
我能做什么?
cgo
为多个 return 值创建一个专用的 C 结构,每个 return 值作为结构元素。
在您的示例中,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();
}