1

我目前正在努力为我必须使用的 DLL 生成 JNA 包装器。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 多年前,所以我肯定有点生疏了。

我在这里想念什么?例如,我希望返回值是 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 是一个接口,我将如何创建这种类型的实例以便我可以实际调用该方法?(我想一旦第一个问题得到解决,这个问题就已经过时了。)

4

0 回答 0