是否可以使用 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
类型。没有万无一失的方法可以在 运行 时确定这一点。
是否可以使用 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
类型。没有万无一失的方法可以在 运行 时确定这一点。