jna 调用c方法,参数和回调相关问题

一.描述
1.C的API方法一

图片说明

2.C的API方法二

图片说明

3.主要java代码
(1)XmNetJNA类

public interface XmNetJNA extends Library {

    XmNetJNA INSTANCE_NET = (XmNetJNA) Native.loadLibrary("XNetSDK", XmNetJNA.class);

    int XSDK_Init(XmInitParamStructure xminitParamStructure);

    void XSDK_UnInit();

    XmResultMsgStructure XSDK_DevLogin(XmLoginParamStructure xmLoginParamStructure, int nTimeout, int nSeq);
}

(2)MessageCallBack 类

public interface MessageCallBack extends StdCallLibrary.StdCallCallback {

    void invoke(int nMsgId, int nParam1);
}

(3)XmMsgCallBackImpl 类

public class XmMsgCallBackImpl implements MessageCallBack {

    @Override
    public void invoke(int nMsgId, int nParam1) {
        System.out.println("invoke ...");
    }
}

(4)测试类

public class AppTest 
{
    @Test
    public void testXSDK(){
        XmNetJNA xmNetJNA = XmNetJNA.INSTANCE_NET;
        System.out.println("init :" + xmNetJNA.toString());
        XmInitParamStructure xmInitParamStructure = new XmInitParamStructure();
        xmInitParamStructure.setnLogLevel(3);
        xmInitParamStructure.setpMsgCallBack(new XmMsgCallBackImpl());
        xmInitParamStructure.setpUserDate(null);
        int init = xmNetJNA.XSDK_Init(xmInitParamStructure);

        XmLoginParamStructure xmLoginParamStructure = new XmLoginParamStructure();
        xmLoginParamStructure.setsDevId("192.168.1.50");
        xmLoginParamStructure.setnDevPort(34567);
        xmLoginParamStructure.setsUserName("admin");
        xmLoginParamStructure.setsPassword("");
        XmResultMsgStructure login = xmNetJNA.XSDK_DevLogin(xmLoginParamStructure, 3000, 0);
        System.out.println("end...");
    }
}

二.报错及问题

1.测试方法testXSDK里,调用XSDK_DevLogin方法出错,报错如下:
图片说明

2.MessageCallBack 回调类是否编写错误,该怎么写

3.XmNetJNA类的XSDK_DevLogin方法的参数和返回值该怎么正确编写

望大牛们指导一下,谢谢!

######################以下为补充#####################

#define XSDK_HANDLE int
typedef int (CALLBACK *PXSDK_MessageCallBack) (XSDK_HANDLE hDevice, int nMsgId, int nParam1, int nParam2, int nParam3, const char *szString, void *pObject, int nSeq, void *pUserData);

////////////////////////////About XSDK////////////////////////////
typedef struct SXSDKInitParam
{
    int nLogLevel;
    PXSDK_MessageCallBack pMsgCallBack;
    void *pUserData;
}SXSDKInitParam;


////////Login////////
typedef enum EDEV_CNN_TYPE
{
    EDEV_CNN_TYPE_IP_DNS = 0,
    EDEV_CNN_TYPE_DAS    = 1,
}EDEV_NET_TYPE;

typedef struct SXSDKLoginParam
{
    char sDevId[128]; // ip/dns/sn
    int  nDevPort;
    char sUserName[64];
    char sPassword[64];
    EDEV_NET_TYPE  nCnnType;
}SXSDKLoginParam;

你这个说明文件连个参数类型都没有,找找 .h 文件,把函数原型,callback的函数原型贴出来看

https://blog.csdn.net/qq_34317125/article/details/80562926
参考方法三