为了账号安全,请及时绑定邮箱和手机立即绑定

尝试访问 JNA 函数时出现 IllegalArgumentException

尝试访问 JNA 函数时出现 IllegalArgumentException

跃然一笑 2023-03-23 14:15:01
我是 JNA 的新手,需要通过 Java 系统的套接字连接将数据发送到遗留 C 系统。我已获得 .dll 和 .h 文件。我必须使用 .h 文件定义访问 C 系统中的函数。我加载了 .dll,当我访问 dll 中的函数时,我得到 IllegalArgumentExceptionpublic static void main(String[] args) {    Arg arg = new Arg();    ExampleDLL exampleDLL = ExampleDLL.INSTANCE;    System.out.println(exampleDLL.someFunctionInDLL(arg));}public interface ExampleDLL extends Library {    ExampleDLL INSTANCE = (ExampleDLL) Native.loadLibrary("exampleDLL.dll", ExampleDLL.class);    int someFunctionInDLL(Arg arg);}public class Arg {    public Byte[] var1 = new Byte[9];    public Byte[] var2 = new Byte[5];    // Getters and Setters....}来自.h 文件:typedef struct{       char var1[9];       char var2[5];                   }Arg;int someFunctionInDLL(Arg *dr);我想我已经成功加载了 dll,但是当我尝试访问 dll 函数时:Exception in thread "main" java.lang.IllegalArgumentException: Unsupported argument type com.*.*.*.Arg at parameter 0 of function someFunctionInDLL帮助将不胜感激。有点坚持这个了一段时间。提前致谢。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

欢迎来到堆栈溢出。您收到错误是因为您的函数期望的参数是一个指针,但您为它提供了一个完整的 Java 类。

int someFunctionInDLL(Arg *dr);

您定义的类Arg应该是一个Structure. 默认情况下,当用作函数参数时,JNA 将 a 转换Strcuture为其指针 ( ),而这正是您希望在此处发生的情况。Structure.ByReference您应该能够通过制作Argextend来修复您的代码Structure

此外,您将字节映射到装箱Byte对象是错误的:您需要原语byte@FieldOrder所以这应该可行(您还需要添加注释):

public class Arg extends Structure { 
   public byte[] var1 = new byte[9]; 
      public byte[] var2 = new byte[5];
}


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 248 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号