Java JNA-如何使用typedef回调

Java JNA-如何使用typedef回调,java,c++,jna,Java,C++,Jna,我正在使用JNA来使用DLL 我有一个疑问 在我以前的代码库中。h: NET_DVR_API LONG __stdcall NET_DVR_function_V30(LONG lUserID, LPNET_DVR_CLIENTINFO lpClientInfo, void(CALLBACK *fRealDataCallBack_V30) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser

我正在使用JNA来使用DLL

我有一个疑问

在我以前的代码库中。h:

NET_DVR_API LONG __stdcall NET_DVR_function_V30(LONG lUserID, LPNET_DVR_CLIENTINFO lpClientInfo, void(CALLBACK *fRealDataCallBack_V30) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser) = NULL, void* pUser = NULL, BOOL bBlocked = FALSE);
在使用JNA的java中,我定义了以下内容:

public interface NewFrameCallback extends StdCallCallback {
    void invoke(int lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int pUser);
}

int NET_DVR_function_V30(int lUserID, HCNetSDKLibrary.NET_DVR_CLIENTINFO lpClientInfo, HCNetSDKLibrary.NewFrameCallback fakeFuncPointer, Pointer pUser, boolean bBlocked);
它成功了

现在我收到一个新的dll,我需要使用其他函数:

在本文中,h的定义如下:

typedef void (CALLBACK *REALDATACALLBACK) (LONG lPlayHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser);

NET_DVR_API LONG __stdcall NET_DVR_function_V30(LONG lUserID, LPNET_DVR_CLIENTINFO lpClientInfo, void(CALLBACK *fRealDataCallBack_V30) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser) = NULL, void* pUser = NULL, BOOL bBlocked = FALSE);
NET_DVR_API LONG __stdcall NET_DVR_function_V40(LONG lUserID, LPNET_DVR_CLIENTINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallBack_V30 = NULL, void* pUser = NULL)
在java中,我只添加:

public interface NewFrameCallback extends StdCallCallback {
    void invoke(int lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int pUser);
}

int NET_DVR_function_V30(int lUserID, HCNetSDKLibrary.NET_DVR_CLIENTINFO lpClientInfo, HCNetSDKLibrary.NewFrameCallback fakeFuncPointer, Pointer pUser, boolean bBlocked);
int NET_DVR_function_V40(int lUserID, HCNetSDKLibrary.NET_DVR_CLIENTINFO lpClientInfo, HCNetSDKLibrary.NewFrameCallback fakeFuncPointer, Pointer pUser);

显然,它不起作用。我如何在JNA中使用typedef?在寻找新的.h时,REALDATACALLBACK看起来与CALLBACK*fRealDataCallBack_V30完全相同

int-pUser
应该是
Pointer-pUser
,尽管这只会在64位平台上产生影响。您的V40映射需要删除最后一个
boolean
参数。这可能就是破坏stdcall堆栈的原因。