私はJNAを使用してDLLを使用しています。
と私は疑問に思いました。
以前のコードでは、library.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を受け取り、他の機能を使用する必要があります:
in .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! と同じように見えます。