我是 JNA 的新手,需要通过 Java 系统的套接字连接将数据发送到遗留 C 系统。我已获得 .dll 和 .h 文件。我必须使用 .h 文件定义访问 C 系统中的函数。我加载了 .dll,当我访问 dll 中的函数时,我得到 IllegalArgumentExceptionpublic 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....}来自.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 回答

慕码人2483693
TA贡献1860条经验 获得超9个赞
欢迎来到堆栈溢出。您收到错误是因为您的函数期望的参数是一个指针,但您为它提供了一个完整的 Java 类。
int someFunctionInDLL(Arg *dr);
您定义的类Arg
应该是一个Structure
. 默认情况下,当用作函数参数时,JNA 将 a 转换Strcuture
为其指针 ( ),而这正是您希望在此处发生的情况。Structure.ByReference
您应该能够通过制作Arg
extend来修复您的代码Structure
。
此外,您将字节映射到装箱Byte
对象是错误的:您需要原语byte
。@FieldOrder
所以这应该可行(您还需要添加注释):
public class Arg extends Structure { public byte[] var1 = new byte[9]; public byte[] var2 = new byte[5]; }
添加回答
举报
0/150
提交
取消