Как написать интерфейс для функции go с несколькими возвращаемыми значениями с помощью JNA
Я пытаюсь экспортировать некоторые функции Go и вызывать их в Java с помощью JNA, но я не знаю, как определить интерфейс в Java для функции Go с несколькими возвращаемыми значениями.
Скажем, функция Go:
//export generateKeys
func generateKeys() (privateKey, publicKey []byte) {
return .....
}
Возвращаемые значения имеют два элемента, но в Java допускается только одно возвращаемое значение.
Что я могу сделать?
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();
}