JNAerator генерирует метод с возвращаемым значением __stdcall - PullRequest
1 голос
/ 07 апреля 2020

В настоящее время я пытаюсь создать оболочку JNA для библиотеки DLL, которую я должен использовать. DLL и соответствующие файлы .h предоставлены IBM (Spectrum Protect aka Tivoli Storage Manager или ADSTAR), и я не могу использовать JNAerator должным образом, как кажется.

Пример:

Это выдержка из одного из файлов заголовков:

extern dsInt16_t DSMLINKAGE  dsmInitEx(
       dsUint32_t            *dsmHandleP,
       dsmInitExIn_t         *dsmInitExInP,
       dsmInitExOut_t        *dsmInitExOutP
);

Этот dsInt16_t оказывается определенным в отдельном файле .h:

typedef signed   short dsInt16_t;

Результат после запуска JNAerator - это не то, что я ожидал:

Tsmapi64Library.__stdcall dsmInitEx(NativeLongByReference dsmHandleP, dsmInitExIn_t dsmInitExInP, dsmInitExOut_t dsmInitExOutP);

Тип возврата определяется следующим образом:

public static class __stdcall extends PointerType {
...
};

Имейте в виду, когда я в последний раз работал с C, учился в школе, и это 20+ лет go, так что я определенно немного ржавый.

Что мне здесь не хватает? Я бы надеялся, что возвращаемое значение будет dsInt16_t или коротким, например.

Дополнительный вопрос: DLL предоставляет метод для объяснения кодов возврата (вышеупомянутое возвращаемое значение dsInt16_t).

Опять же, это определение в файле .h:

extern dsInt16_t DSMLINKAGE  dsmRCMsg(
       dsUint32_t            dsmHandle,
       dsInt16_t             dsmRC,
       char                  *msg
);

... и это результирующий код Java:

Tsmapi64Library.__stdcall dsmRCMsg(NativeLong dsmHandle, dsInt16_t dsmRC, ByteBuffer msg);

Итак, это " перевел "C -параметр типа dsInt16_t в Java тип dsInt16_t, что приятно. Поскольку этот Java тип dsInt16_t является интерфейсом, как я смогу создать экземпляр этого типа, чтобы я мог на самом деле вызвать метод? (Думаю, этот вопрос устареет после того, как будет решен первый.)

...