错误信息如下:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unsupported argument type com.synjones.angel.CardData at parameter 2 of function Syn_ReadMsg
at com.sun.jna.Function.convertArgument(Function.java:552)
at com.sun.jna.Function.invoke(Function.java:258)
at com.sun.jna.Library$Handler.invoke(Library.java:216)
at $Proxy0.Syn_ReadMsg(Unknown Source)
at com.synjones.angel.TestDlg.actionPerformed(TestDlg.java:302)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)出错函数原型:public int Syn_ReadMsg(int iPort, int iIfOpen, CardData pINCardData);
调用如下:SynIDCardAPI.INSTANCE.Syn_ReadMsg(0, 0, idcardData);//idcardData为CardData 
导入的DLL语句:SynIDCardAPI INSTANCE = (SynIDCardAPI)Native.loadLibrary("E:\\SynIDCardAPI", SynIDCardAPI.class);
DLL中C++声明:int _stdcall Syn_ReadMsg( int iPort,int iIfOpen,IDCardData *pIDCardData );

解决方案 »

  1.   

    public class IllegalArgumentExceptionextends RuntimeException抛出的异 常表明向方法传递了一个不合法或不正确的参数。 
    看下API说明
      

  2.   

    Unsupported argument type com.synjones.angel.CardData at parameter 2 of function Syn_ReadMsg 
    LZ学过英语没?提示这么清楚
      

  3.   

    Unsupported argument type 参数类型有问题
    不支持类com.synjones.angel.CardData中Syn_ReadMsg方法第二个参数
      

  4.   

    第二个参数是int类型的,传入的是0,为什么还会报错呢?
      

  5.   

    public class IllegalArgumentException
    extends RuntimeException
    抛出的异常表明向方法传递了一个不合法或不正确的参数。 
    说的很清楚啊
      

  6.   

    可能是第3个,你把第3个的参数改为null,看看怎么说?
      

  7.   

    显然说的是第三个参数,int型怎么会非法类型异常呢?建议楼主好好学习一下jni里面对象类型的参数传递问题。
      

  8.   

    多谢大家了,我都没有用过Java。我改改看看,解决了马上给分。有问题我再来问
      

  9.   

    这个问题是说我的CardData中第二个参数有问题是吗?
    Syn_ReadMsg在TestDlg.java中,而CardData在CardData中。
      

  10.   

    CardData类型在C中的定义:
    typedef struct tagIDCardData{
    char Name[32];        
    char Sex[6];
    char Nation[20];
    char Born[18];
    char Address[72];
    char IDCardNo[38];
    char GrantDept[32]; 
    char UserLifeBegin[18];
    char UserLifeEnd[18];
    char reserved[38];
    char PhotoFileName[255];
    }IDCardData;
    下面是我在Java中的定义:
    public class CardData {
    public byte[] name;
    public byte[] sex;
    public byte[] nation;
    public byte[] born;
    public byte[] address;
    public byte[] idCardNo;
    public byte[] grantDept;
    public byte[] userLifeBegin;
    public byte[] userLifeEnd;
    public byte[] reserved;
    public byte[] photoFileName; 

    public CardData(){
    name=new byte[32];
    sex=new byte[6];
    nation=new byte[20];
    born=new byte[18];
    address=new byte[72];
    idCardNo=new byte[38];
    grantDept=new byte[32];
    userLifeBegin=new byte[18];
    userLifeEnd=new byte[18];
    reserved=new byte[38];
    photoFileName=new byte[255];
    }
    }
    这样有问题吗?
      

  11.   

    Unsupported argument type com.synjones.angel.CardData at parameter 2 of function Syn_ReadMsg 
    不是第二个参数,应该是值为2的参数。
      

  12.   


    加个断点看一下 在看一下 API的说明就知道你错误在那里了 试试看看 
      

  13.   

    此函数的构造如下
      int Syn_ReadMsg(int a, int b, IDCardData c) 
      

  14.   

    加了,但是是C的DLL函数,根本跟踪不进去
      

  15.   

    我确定是这个函数错了,我也知道是第三个参数出错。但是我不知道怎么改。大家看一下我的C的structure,Java那么写不对吗?
      

  16.   

    我把第三个参数改成NULL就可以执行到函数内部了,但是我需要第三个参数保存一些信息。大家帮帮忙呀!我把类名改成和C中一样的IDCardData,问题还是出现。有知道这是为什么的吗?
      

  17.   

    保存数据的类结构public class CardData 忘了继承Structure。写成
    public class CardData entend Structure{
    }