尝试访问 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);
你定义的Arg
class应该是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];
}
我是 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);
你定义的Arg
class应该是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];
}