首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用JNA来获得函数的签名?

是否可以使用JNA来获得函数的签名?
EN

Stack Overflow用户
提问于 2021-10-30 10:45:32
回答 1查看 74关注 0票数 2

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

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

代码语言:javascript
复制
__declspec(dllexport) void receive(bool boolValue, int intValue);

以及相关的Java接口:

代码语言:javascript
复制
public interface MyLibrary extends Library {
  public void receive(int intValue, bool boolValue);
}

如果加载库,就没有问题,但是如果调用接口的receive方法,当然会出错,因为该方法的签名与相应函数的签名不一致。

在调用该方法之前,是否有任何方法知道对齐是否已关闭?我想用:

代码语言:javascript
复制
Function function = NativeLibrary.getFunction("receive");

但在那之后,我似乎对函数的签名没有任何了解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 19:09:32

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

如果JNA无法找到具有相同数量的参数的匹配函数,您将得到一个错误:

java.lang.UnsatisfiedLinkError:查找函数‘Foo’时出错:找不到指定的过程。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69778863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档