尝试访问 JNA 函数时出现 IllegalArgumentException

IllegalArgumentException when trying to access a JNA function

我是 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....
}

From.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

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

欢迎来到 Stack Overflow。您收到错误是因为您的函数期望的参数是一个指针,但您为它提供了一个完整的 Java class.

int someFunctionInDLL(Arg *dr);

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

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

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