尝试访问JNA函数时发生IllegalArgumentException

时间:2019-07-12 16:07:27

标签: java jna

我对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

我们将不胜感激。这种卡住了一段时间。 预先感谢。

1 个答案:

答案 0 :(得分:0)

欢迎使用堆栈溢出。之所以会出现错误,是因为函数期望的参数是指针,但是您正在为其提供完整的Java类。

int someFunctionInDLL(Arg *dr);

您定义的Arg类应该是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];
}