В настоящее время я пытаюсь создать оболочку 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 является интерфейсом, как я смогу создать экземпляр этого типа, чтобы я мог на самом деле вызвать метод? (Думаю, этот вопрос устареет после того, как будет решен первый.)