尝试访问 JNA 函数时出现 IllegalArgumentException

我是 JNA 的新手,需要通过 Java 系统的套接字连接将数据发送到遗留 C 系统。我已获得 .dll 和 .h 文件。


我必须使用 .h 文件定义访问 C 系统中的函数。


我加载了 .dll,当我访问 dll 中的函数时,我得到 IllegalArgumentException


public 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

帮助将不胜感激。有点坚持这个了一段时间。提前致谢。


跃然一笑
浏览 250回答 1
1回答

慕码人2483693

欢迎来到堆栈溢出。您收到错误是因为您的函数期望的参数是一个指针,但您为它提供了一个完整的 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]; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java