我有一个带有DLL库的SDK。 我正在从Java 1.8和JNA v3.0.9调用库,但是在定义结构时遇到了麻烦
SDK文档指出:
调用NET_DVR_STDXMLConfig来传递请求URL:GET / ISAPI / AccessControl / UserInfo / capabilities?format = json,以使人员管理功能了解配置详细信息和注意事项。
NET_DVR_STDXMLConfig API调用定义为:
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.
NET_DVR_XML_CONFIG_INPUT结构的定义:
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.
NET_DVR_MIME_UNIT结构的定义是
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.
到目前为止,这是我在Java中所做的事情:DLL调用和结构定义
//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 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 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 getFieldOrder() {
return Arrays.asList("szContentType", "szName", "szFilename", "dwContentLen", "pContent","byRes");
这是我的库调用
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
我不确定自己的结构。 设置requestURL时,我获取了一个空指针。我的调用还返回了一个通用的“参数无效”错误消息。
任何帮助,不胜感激。
我有一个带有DLL库的SDK。 我正在从Java 1.8和JNA v3.0.9调用库,但是在定义结构时遇到了麻烦SDK文档指出:调用NET_DVR_STDXMLConfig来传递请求URL:GET / ISAPI / AccessControl / UserInfo / capabilities?format = json,以使人员管理功能了解配置详细信息和注意事项。NET_DVR_STDXML...
Net_Dvr_中文-注意事项
首先,感谢您选用我公司最新产品。
在
使用
本监控卡之前,请详细阅读本说明书所涉及的相关事项,熟悉硬件、软件各部分的功能后,方能
使用
,以确保该系统为您发挥最佳功能。否则一切后果自负。
本说明书将向您详细阐述全实时“视频监控系统”的安装、操作、设置和网络
使用
方法。
本系统工作主机供电电压为220V±10%,如果在电压不稳或者干扰大的场合,请您选用优质稳压电源(即UPS),保证系统正常良好的工作状态。
本系统在安装、拆卸视频采集卡时,必须将主机处于完全断电状态,否则主板上残留的电压将损坏采集卡。
本系统可切换D1与CIF分辨率,切换分辨率设置后,在主界面必须关闭通道视频,重新打开通道视频,设置才能生效。
本系统主机工作于常温(-10±3℃~55±2℃)、清洁的环境,并且保持良好的通风状态。
本系统软件属于我公司专有产品,未经同意,请勿复制,否则影响机器稳定概不负责,并将通过有关法律渠道追究盗版责任。
https://www.hikvision.com/cn/download_61.html
2.登录海康sdk包
库
文件中的ClientDemo.exe 然后添加设备 只用填写ip,用户名,密码即可 端口默认为8000
我这里的设备是连接的公司的wifi 连接后就会显示ip,用户名为admin ,密码为设备登录管理界面的密码
添加后点击预览能显示表示参数正确
3.
java
开发
我这里的开发流程是 扫脸——回调函数逻辑判断——远程控门
<!-- 用的这个低版本的,换成高版本的需要修改extends Structure的类增加getFieldOrder方法 -->
<dependency>
<groupId>net.
java
.dev.
jna
</groupId>
<artifactId>
jna
</artifactId>
<version>3.0.9</version&g
Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头2.Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept:text/xml;
代表客户端希望接受的数据类型是xml类型Content-T
1. 编写 C++ 动态链接
库
(
DLL
)并导出函数
在 C++ 中编写需要被
调用
的函数,并
使用
`extern "C"` 关键字将其导出,以使其能够被其他语言
调用
。例如,下面是一个 C++
DLL
中的函数:
```cpp
extern "C" {
__declspec(
dll
export) int add(int a, int b) {
return a + b;
2.
使用
JNA
创建
Java
接口
在
Java
中
使用
JNA
创建一个接口来表示 C++
DLL
中的函数。例如,下面是一个接口:
```
java
import com.sun.
jna
.Library;
import com.sun.
jna
.Native;
public interface MyLibrary extends Library {
MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("myLibrary", MyLibrary.class);
int add(int a, int b);
3.
调用
C++ 函数
现在可以在
Java
中
使用
`MyLibrary.INSTANCE` 来
调用
C++
DLL
中的函数。例如:
```
java
int result = MyLibrary.INSTANCE.add(2, 3);
System.out.println("Result: " + result);
这将输出 `Result: 5`。
需要注意的是,为了使
JNA
能够正确地将
Java
类型转换为 C++ 类型,需要确保
Java
类型与 C++ 类型具有相同的大小和布局。如果
Java
类型与 C++ 类型不匹配,则需要
使用
JNA
提供的数据类型转换功能。