I have an SDK with DLL libraries. I am invoking the libraries from Java 1.8 and JNA v3.0.9 I am having trouble defining the structures
The SDK documentation states:
Call NET_DVR_STDXMLConfig to pass through the request URL: GET /ISAPI/AccessControl/UserInfo/capabilities?format=json for getting the person management capability to know the configuration details and notices.
NET_DVR_STDXMLConfig API call definiton is:
BOOL NET_DVR_STDXMLConfig( LONG lUserID, NET_DVR_XML_CONFIG_INPUT *lpInputParam, NET_DVR_XML_CONFIG_OUTPUT *lpOutputParam ); lpInputParam [IN] Input parameters, refer to the structure NET_DVR_XML_CONFIG_INPUT for details. lpOutputParam [IN/OUT] Output parameters, refer to the structure NET_DVR_XML_CONFIG_OUTPUT for details. Definition of NET_DVR_XML_CONFIG_INPUT structure:
struct{ DWORD dwSize; void *lpRequestUrl; DWORD dwRequestUrlLen; void *lpInBuffer; DWORD dwInBufferSize; DWORD dwRecvTimeOut; BYTE byForceEncrpt; BYTE byNumOfMultiPart; BYTE byRes[30]; } dwSize Structure size. lpRequestUrl Request URL (command) for implement different functions, and it is in string format. dwRequestUrlLen Request URL size. lpInBuffer Buffer for storing input parameters (request messages), see the input content details structure in NET_DVR_MIME_UNIT. dwInBufferSize Input buffer size. dwRecvTimeOut Receiving timeout, unit: ms, 0-5000ms (default). byForceEncrpt Whether to enable force encryption (the messages will be encrypted by AES algorithm for transmission): 0-no, 1-yes. byNumOfMultiPart Number of message segments: 0-invalid; other values-number of message segments, which is transmitted by the parameter lpInBuffer in the structure NET_DVR_MIME_UNIT. The definition of NET_DVR_MIME_UNIT structure is
struct{ char szContentType[32]; char szName[MAX_FILE_PATH_LEN/*256*/]; char szFilename[MAX_FILE_PATH_LEN/*256*/]; DWORD dwContentLen; char* pContent; BYTE byRes[16]; } szContentType Content type (corresponds to Content-Type field in the message), e.g., text/json. text/xml, and so on. The content format must be supported by HTTP. zName Content name (corresponds to name field in the message), e.g., name="upload". szFilename Content file name (corresponds to filename field in the message), e.g., filename="C:\Users\test\Desktop\11.txt". dwContentLen Content size. pContent Data point. And this is what I have done in Java so far: DLL call and Structure definition
//DLL native call boolean NET_DVR_STDXMLConfig(int lUserID, Pointer lpInputParam, Pointer lpOutputParam); public static class NET_DVR_XML_CONFIG_INPUT extends Structure { public int dwSize; public Pointer lpRequestUrl; public int dwRequestUrlLen; public Pointer lpInBuffer; public int dwInBufferSize; public int dwRecvTimeOut; public byte byForceEncrpt; public byte byNumOfMultiPart; public byte[] byRes = new byte[30]; @Override protected List<String> getFieldOrder() { return Arrays.asList("dwSize", "lpRequestUrl", "dwRequestUrlLen", "lpInBuffer", "dwInBufferSize", "dwRecvTimeOut","byForceEncrpt","byNumOfMultiPart", "byRes"); } } public static class NET_DVR_XML_CONFIG_OUTPUT extends Structure { public int dwSize; public Pointer lpOutBuffer; public int dwOutBufferSize; public int dwReturnedXMLSize; public Pointer lpStatusBuffer; public int dwStatusSize; public byte[] byRes = new byte[32]; @Override protected List<String> getFieldOrder() { return Arrays.asList("dwSize", "lpOutBuffer", "dwOutBufferSize", "dwReturnedXMLSize", "lpStatusBuffer", "dwStatusSize", "byRes"); } } public static class NET_DVR_MIME_UNIT extends Structure{ public byte[] szContentType = new byte[32]; public byte[] szName = new byte[MAX_FILE_PATH_LEN]; public byte[] szFilename = new byte[MAX_FILE_PATH_LEN]; public int dwContentLen; public String pContent; public byte[] byRes = new byte[16]; @Override protected List<String> getFieldOrder() { return Arrays.asList("szContentType", "szName", "szFilename", "dwContentLen", "pContent","byRes"); } } And this is my library invocation
NET_DVR_XML_CONFIG_INPUT struInput = new NET_DVR_XML_CONFIG_INPUT(); NET_DVR_XML_CONFIG_OUTPUT struOuput = new NET_DVR_XML_CONFIG_OUTPUT(); String strInput = new String("GET /ISAPI/AccessControl/UserInfo/capabilities?format=json\r\n\""); byte[] byInput = strInput.getBytes(); System.arraycopy(byInput, 0, struInput.lpRequestUrl, 0, byInput.length); // Nullpointer exception struInput.dwRequestUrlLen = byInput.length; NET_DVR_MIME_UNIT mimeUnit = new NET_DVR_MIME_UNIT(); //mimeUnit.pContent = new Memory(MAX_XML_CONFIG_LEN); // Dont know what to put in here struInput.lpInBuffer = mimeUnit.getPointer(); struOuput.dwOutBufferSize = MAX_XML_CONFIG_LEN; struOuput.dwStatusSize = struOuput.dwOutBufferSize; struInput.write(); struOuput.write(); NET_DVR_STDXMLConfig(userID,struInput.getPointer(), struOuput.getPointer()); // Getting a generic "parameters not valid" error msg I am not sure about my structures. Im gettign a nullpointer when setting the requestURL Also my invocation returns a generic "parameters not valid" error message.
Any help much appreciated.
Thanks in advance