是否可以使用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");但在那之后,我似乎对函数的签名没有任何了解。
发布于 2021-10-30 19:09:32
不,没有自动机制,实际上,在实现JNA映射时,错误的映射类型可能是最常见的错误,这通常是我在代码行为不当时首先检查的事情。
如果JNA无法找到具有相同数量的参数的匹配函数,您将得到一个错误:
java.lang.UnsatisfiedLinkError:查找函数‘Foo’时出错:找不到指定的过程。
如果方法名称与本机函数匹配,且参数数量匹配,JNA将不会给出任何不正确映射的明显指示,但是,如果您编写健壮的单元测试并试图从本机函数获得正常/预期的输出,这将有助于捕获大多数错误(虽然" catch“表示”显示奇怪的症状“)。
您仍然可能错过平台相关的错误,例如32位对64位的long或指针类型。
在某些情况下,在技术上不可能知道编译库的正确映射,其中某些类型的字节宽度取决于编译时开关,例如off_t类型。在运行时没有确定这一点的万无一失的方法。
https://stackoverflow.com/questions/69778863
复制相似问题