我对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
我们将不胜感激。这种卡住了一段时间。 预先感谢。
答案 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];
}