我目前正在努力为我必须使用的 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 是一个接口,我将如何创建这种类型的实例以便我可以实际调用该方法?(我想一旦第一个问题得到解决,这个问题就已经过时了。)