是否可以使用 JNA 获取函数的签名

Is it possible to use JNA to get the signature of a function

是否可以使用 JNA 检查 Java 接口的签名是否与关联的 C 函数的签名一致?

例如,假设我的 C 代码有以下 C 接口:

__declspec(dllexport) void receive(bool boolValue, int intValue);

以及关联的Java接口:

public interface MyLibrary extends Library {
  public void receive(int intValue, bool boolValue);
}

如果我加载库,我不会有问题,但是如果调用接口的receive方法当然会出错,因为方法的签名与方法的签名不对齐对应的函数。

有什么方法可以在调用该方法之前知道对齐已关闭?我虽然关于使用:

Function function = NativeLibrary.getFunction("receive");

但在那之后,我似乎对函数的签名一无所知。

不,没有自动化机制,事实上,不正确的映射类型可能是实现 JNA 映射时最常见的错误,这通常是我在代码出现异常时首先检查的事情。

如果 JNA 找不到参数数量相同的匹配函数,您将收到错误消息:

java.lang.UnsatisfiedLinkError: Error looking up function 'Foo': The specified procedure could not be found.

如果方法名称与本机函数匹配,并且参数数量匹配,JNA 将不会给出任何明显的不正确映射指示,但是如果您编写健壮的单元测试并尝试获得 sane/expected 输出从本机函数,这将有助于捕获大多数错误(尽管“捕获”意味着“显示奇怪的症状”。)

您仍然可能会错过与平台相关的错误,例如 32 位与 64 位 long 或指针类型。

在某些情况下,技术上无法知道编译库的正确映射,其中某些类型的字节宽度取决于编译时开关,例如 off_t 类型。没有万无一失的方法可以在 运行 时确定这一点。