Как написать интерфейс для функции 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();
}
Другие вопросы по тегам