gpt4 book ai didi

java - 尝试访问 JNA 函数时出现 IllegalArgumentException

转载 作者:行者123 更新时间:2023-12-02 03:07:59 25 4
gpt4 key购买 nike

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

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

最佳答案

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

int someFunctionInDLL(Arg *dr);

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

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

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

关于java - 尝试访问 JNA 函数时出现 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com